|
[StructLayout(LayoutKind.Sequential)]
private class NETRESOURCE
{
public Int32 dwScope = 0;
public Int32 dwType = 0;
public Int32 dwDisplayType = 0;
public Int32 dwUsage = 0;
public string lpLocalName = null;
public string lpRemoteName = null;
public string lpComment = null;
public string lpProvider = null;
}
[DllImport("mpr.dll")]
private static extern Int32 WNetAddConnection2
(NETRESOURCE lpNetResource,
[MarshalAs(UnmanagedType.LPTStr)] string lpPassword,
[MarshalAs(UnmanagedType.LPTStr)] string lpUsername,
Int32 dwFlags);
[DllImport("mpr.dll")]
private static extern Int32 WNetCancelConnection2
([MarshalAs(UnmanagedType.LPTStr)] string lpResourceName,
[MarshalAs(UnmanagedType.Bool)] bool bForce);
public void MapShareToDrive(string share, string localdrive, string username, string password)
{ // Prepare for network access
NETRESOURCE netResource = new NETRESOURCE();
netResource.dwScope = 1;
netResource.dwType = 1; //RESOURCETYPE_DISK
netResource.lpLocalName = localdrive;
netResource.lpRemoteName = share;
// Connect to network share
int iRetVal = WNetAddConnection2(netResource, password, username, 8);
// You can also do the following to make the system prompt for username/password
// int iRetVal = WNetAddConnection2(netResource, "", "", 16);
if (iRetVal != 0)
{
throw new System.IO.IOException("Failed to gain access to network share. Error code: " + iRetVal);
}
}
Hi if I used the code example with parameter dwFlags = 0 then I always got error = 5.
If I changed the parameter dwFlags = 8 then the dialog for mapping network prompted?
If I am understanding things right I thought the parameter dwFlags = 16 should prompt the mapping dialog.
Best regards,
Gardar
|
|
|
|
|
Another quick and dirty alternative to Roman's (although I'd prefer that way in production code) is to simply use the Process class to start the net.exe application with the necessary command-line arguments.
For example, barring any requirements for a username and password, you could do it as simply as this:
public void MapDrive(char drive, string path)
{
Process.Start("net.exe", string.Format("{0}: {1}", drive, path));
} That's very simplistic and you might want to look at the overloads for Process.Start to hide the console window that would be displayed automatically (in Windows, this is unavoidable; in Windows NT, you can stop the PE loader from displaying the console window for executables using the console subsystem).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks very much for this, I will try both ways.
Regards,
Gardar
|
|
|
|
|
I read a posting somewhere (I think on the CP but I cannot find it) about using Visual Studio 6 to write .Net code. I mentioned it to a friend and he wants to give it a try but I cannot find the article. Has anyone done this before??
|
|
|
|
|
You don't need Visual Studio (any version) at all. Download the .NET Framework (that alone is enough) and the SDK for more tools (like the IL Disassembler, ildasm.exe). Any vanilla text editor will do. When writing samples for the C# forum here, I typically write-up something (if I feel like testing it, or debugging someone else's code when the problem is elusive) using console-mode VIM[^]. I then use the command-line compilers (like csc.exe, resgen.exe, licgen.exe, etc.) and - viola - you have a program.
If it is possible using VS6, it's definitely a massive hack and probably doesn't include very good designer support. I wouldn't recommend it.
Optionally heading that warning, http://www.google.com[^] can find just about anything if you use the right keywords.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
using console-mode VIM[^].
You heathen!
Sorry, I'm in an odd mood today...had beer for a work-lunch-meeting, so now I want a nap...
Jeremy Kimball
Moderation is for monks. -Lazarus Long
And this, too, shall pass away...
|
|
|
|
|
What, you expect me to use emacs?!
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hello.
After analyzing the software industry, I believe C# and .NET are and will remain apart of a major set of development tool on the Win32 and Win64 platform second to only a combination of C/C++. With that in mind, I would like to ask what is the most complete and advanced programming book on C#/.NET?
Here are the books I am considering.
Programming Microsoft .NET by Jeff Prosise
Pro: Very good overall
Con: Broad and emphasizes .ASP
Programming Windows with C# (Core Reference) by Charles Petzold
Pro: Complete - discusses all GUI tools, etc.
Con: Fundamental - many examples of Windows Forms and no advanced design including multithreading, etc.
Applied Microsoft .NET Framework Programming by Jeffrey Richter
Pro: Extensive coverage of CRT and .NET
Con: Overrated, lacking advanced subjects including multithreading, etc. It is not like his previous book on Win32 programming.
I am trying to buy as few books as possible and still acquire a good overall understanding of C#/.NET and extensive converage of the framework for maximizing an application's performance. I am interested in multithreading, multiple processes, memory mapping, IPC, serial communication, socket, etc.
I believe I can learn the specifics (GUI) via experimenting, MSDN, and of course forums.
Thanks,
Kuphryn
|
|
|
|
|
Read the .NET Framework SDK, including all the topics. The ending is obvious, but it's still thrilling.
And don't forget the Framework Class Library (FCL) anthology, which you can find in %WINDIR%\Microsoft.NET\Framework\v1.X.XXXX. It's best read with ildasm.exe from the .NET Framework SDK - and previously reading up on IL is helpful - but can be read with others tools like .NET Reflector[^].
Best darn books I've ever read.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath Stewart wrote:
Best darn books I've ever read.
Those are the book recommendations I would expect from you Heath, absolutely.
- Nick Parker My Blog | My Articles
|
|
|
|
|
I have a two classes A and B
public class A
{
private static ArrayList allobjects=new ArrayList();
private static int objcount=0;
public A()
{
objcount++;
allobjects.Add(this);
}
public static A[] AllObjects
{
get{return allobjects.ToArray(typeof(A)) as A[];}
}
}
public class B:A
{
public B()
{}
} When I construct a B object it is added to the allobjects array fine.
However at random times, when I look at A.AllObjects in the debugger, there are more objects than what I added. For example if I construct one and I look at it there will be 7 in the array. Furthermore, if I look at A.allobjects[0].allobjects, this array will contain 13, if I go further I'll get 19 and so forth. If I put a breakpoint in the constructor, it never hits the breakpoint, yet objcount will reflect the number of objects in the array depending on how deep I go. So any A.allobjects[0].objcount=7, and A.allobjects.[0].allobjects[0].objcount=13 and so forth. This is bugging me out especially since I have a breakpoint in the constructor and that is the only place that objcount is incremented.
Any help would be greatly appreciated.
K
|
|
|
|
|
Hi
I got a question, how can I access to a DataSet or any object from another Form in the same project??.
I have a main form, (no MDI), and show a dialog, but I wanna that dialog use a Dataset from the main form.
Thanks.
----
hxxbin
|
|
|
|
|
If you design your application properly things like datasets won't be controlled by forms so you shouldn't need to pass a dataset between forms.
Here is a good place to start: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpatterns/html/DesMVC.asp[^]
Also, analysing the way you asked your question ("from another Form in the same project") I have some doubts about your understanding of Object Orientation. So you may like to read also http://www.codeproject.com/useritems/beginneroop.asp[^] which was written with examples in C++ but the concept equally applies to C#
Finally, to actually answer your question I have provided a example implementation.
In the method in the main form that opens the dialog do something like this:
DialogForm dlg = new DialogForm();
dlg.TheDataset = this.myDataset;
dlg.ShowDialog();
where:
this.myDataset is your dataset
and
dlg.TheDataset is defined in your Dialog Form's class as
public Dataset TheDataSet
{
set
{
this.theDataset = value;
}
}
and that the Dialog Form also has a field defined as:
private Dataset theDataset
Does this help?
"You can have everything in life you want if you will just help enough other people get what they want." --Zig Ziglar
"On two occasions, I have been asked [by members of Parliament], 'Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?' I am not able to rightly apprehend the kind of confusion of ideas that could provoke such a question."
--Charles Babbage (1791-1871)
|
|
|
|
|
Is there any way programmatically generating the proxy (that will the web service methods) instead of doing it by via 'Add Web Reference' or 'WSDL.exe'?
Promise only what you can do. And then deliver more than what you promised. This signature was created by "Code Project Quoter".
|
|
|
|
|
Kant wrote:
Is there any way programmatically generating the proxy (that will the web service methods) instead of doing it by via 'Add Web Reference' or 'WSDL.exe'?
I don't know what you're trying to accomplish, but isn't easier to simply send/receive the SOAP message through HTTP? After all, it's just a bunch of well-documented XML...
I see dumb people
|
|
|
|
|
Daniel Turini wrote:
I don't know what you're trying to accomplish
I am just curious. Other day I was talking to a friend who asked me this question.
Ex: In a GUI application, let the user input the URL of the web service and based on that can we generate the proxy?
Promise only what you can do. And then deliver more than what you promised. This signature was created by "Code Project Quoter".
|
|
|
|
|
Kant wrote:
Ex: In a GUI application, let the user input the URL of the web service and based on that can we generate the proxy?
You can always generate the proxy and compile it. But I think that the easier way would be reading the WSDL definition (after all, it's usually a really simple XML) and creating a SOAP message (another XML), then send it through HTTP. Probably you'll find some sample (not in .NET) that already does this...
I see dumb people
|
|
|
|
|
Unless you want a typed web service proxy, you could extend SoapHttpClientProtocol (which generated web service proxies do by default) and instantiate that, either providing the URL to the WSDL document in the constructor or set the Url property (inheritted from WebClientProtocol ) after instantiation. As soon as you call Discover to set up the bindings, you can use Invoke to invoke the methods you want. Invoke is protected, which is why you must extend the SoapHttpClientProtocol , but you could always expose an override as public if you wanted. You could do the same with the asynchronous protected methods (BeginInvoke and EndInvoke ).
Without knowing what the bindings are, however, this could get pretty messy. That's where the DiscoveryClientProtocol comes in, another derivative of the WebClientProtocol . From this you can get a DiscoveryDocument which you can use to discover the bindings supported by the web service.
If you want to generate typed proxies, you can use the concepts presented above to do that. As I mentioned, the proxies extend SoapHttpClientProtocol and add methods for each of the bindings through discovery and simple call the protected Invoke to call them (or the asynchronous methods to support asynchronous methods on your proxy).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Heath,
Thank you for the great idea.
I actually tried to extend SoapHttpClient as you said:
public class MySoapHttpClient : SoapHttpClient {
public string TestWebMethod() { this.Invoke("TestWebMethod", ...);}
}
and use it as
MySoapHttpClient obj = new MySoapHttpClient();
obj.Url ="http://localhost/WebService7/Service1.asmx";
obj.Discover();
string s = obj.TestWebMethod();
It works fine. But I cannot replace the signaure "TestWebMethod" with a generic one "Invoke(string MethodName)".
Does it mean that Binding must be reflected in the proxy ? Or there are some ways to go arround.
James
|
|
|
|
|
You can, but you must hide the protected member by using new :
public new object[] Invoke(string methodName, object[] parameters)
{
return base.Invoke(methodName, parameters);
}
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi
I am uploading a file, using HTTPPostedFile.
Uploads are going fine but i want to compress the posted file
(a JPEG image actually) on the fly (i.e. before storing in the database).
For example if the client computer has selected a JPEG image file of 1056 Kb, the file uploaded / saved file size is reduced to , say 200-300 kb.
Can this be accomplished?
Any help would be appreciated
Africa is a though country
--"Hello daar vir die Afrikaans sprekendes"--
|
|
|
|
|
Since JPEG images are already compressed by their very nature, you won't get to compress them any more than MAYBE 1%.
The only method you have is to reduce the actual image size, from say 1280x1024 down to 320x240 and store that. This is the only way your going to save space. Unfortunatly, you can't blow the picture back up to it original size without a severe penalty in image quality.
RageInTheMachine9532
|
|
|
|
|
JPEG is a lossy compression algorithm: if he wants to lose some image quality, he can keep the image size and further reduce the file size, with a loss on the image size (a drop to 25% image quality produces a way better result than a shrink/expand to 25% size).
I see dumb people
|
|
|
|
|
Okay. I'm sure I'm missing something really simple, but I am thus far unable to get ChooseColor (exported from comdlg32.dll) to work.
Before anyone suggests it, I know there's a ColorDialog control available. Using it is not an option, however, since the app I'm working on is for .Net CF. When calling the ChooseColor method, the runtime returns a really useful System.NotSupportedException.
My code looks like the following:
public struct CHOOSECOLOR<br />
{<br />
public int Flags;<br />
public IntPtr hInstance;<br />
public IntPtr hwndOwner;<br />
public IntPtr lCustData;<br />
public IntPtr lpCustColors;<br />
public IntPtr lpfnHook;<br />
public string lpTemplateName;<br />
public int lStructSize;<br />
public int rgbResult;<br />
}<br />
<br />
[DllImport("comdlg32.dll")]<br />
internal static extern bool ChooseColor(ref CHOOSECOLOR pChooseColor);<br />
<br />
<br />
public void ShowColorDialog(Form parent)<br />
{<br />
if(parent != null)<br />
{<br />
CHOOSECOLOR color = new CHOOSECOLOR();<br />
color.lStructSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(CHOOSECOLOR));<br />
color.hwndOwner = FindWindow(null, parent.Text);<br />
<br />
bool result = ChooseColor(ref color);<br />
}<br />
}
Any help is much appreciated.
The most exciting phrase to hear in science, the one that heralds the most discoveries, is not 'Eureka!' ('I found it!') but 'That's funny...’
|
|
|
|
|
The .NET CF Interop marshaler is a bit quirky. So here is the code that will do exactly what you want. Notice the use of LocalAlloc and LocalFree
<br />
[StructLayoutAttribute(LayoutKind.Sequential)]<br />
private class CHOOSECOLOR: IDisposable<br />
{<br />
private int lStructSize;<br />
<br />
internal IntPtr hwndOwner;<br />
<br />
private IntPtr hInstance;<br />
<br />
internal int rgbResult;<br />
<br />
internal IntPtr lpCustColors;<br />
<br />
internal uint Flags;<br />
<br />
private int lCustData = 0;<br />
<br />
private IntPtr lpfnHook;<br />
<br />
private IntPtr lpTemplateName;<br />
<br />
<br />
public CHOOSECOLOR()<br />
{<br />
lStructSize = Marshal.SizeOf(this);<br />
hwndOwner = IntPtr.Zero;<br />
hInstance = IntPtr.Zero;<br />
rgbResult = 16777215;<br />
lpCustColors = LocalAlloc(64, 64);<br />
Flags = 0;<br />
lCustData = 0;<br />
lpfnHook = IntPtr.Zero;<br />
lpTemplateName = IntPtr.Zero;<br />
}<br />
<br />
public virtual void Dispose()<br />
{<br />
LocalFree(lpCustColors);<br />
}<br />
}<br />
<br />
<br />
[DllImport("coredll.dll")]<br />
private static extern IntPtr LocalAlloc(int flags, int size);<br />
<br />
[DllImport("coredll.dll")]<br />
private static extern int LocalFree(IntPtr addr);<br />
<br />
[DllImport("comdlg.dll")]<br />
private static extern int ChooseColor(CHOOSECOLOR pChooseColor);<br />
<br />
[DllImport("comdlg.dll")]<br />
private static extern int CommDlgExtendedError();<br />
<br />
private void ShowChooseColor(object sender, System.EventArgs e)<br />
{<br />
CHOOSECOLOR color = new CHOOSECOLOR();<br />
int result = ChooseColor(color);<br />
if (result == 0)<br />
{<br />
MessageBox.Show("CommDlgExtendedError = " + CommDlgExtendedError().ToString());<br />
}<br />
}<br />
|
|
|
|
|