|
I'm no expert on C++ interfacing, so I'd defer to Richard on this, but I think marshaling as UnmanagedType.LPStr might take care of this.
According to the MSDN docs, that'd send them through as single-byte, null-terminated strings. Would eliminate the need to convert from Unicode.
EDIT: Never mind, looks like you already figured this out
|
|
|
|
|
Some of the replies you got contain too much attributes IMO. Passing strings between C# and native code is pretty easy, you don't even need all those Marshal thingies, a simple CharSet = CharSet.Unicode
[ADDED] or CharSet = CharSet.ASCII [ADDED]
in your DllImport should do it. You must get rid of the ref keywords obviously, as a string is always passed as a pointer anyway. And if one or more of those strings are meant to be output parameters, the easiest way is by using a StringBuilder . I think I covered all these essentials in this article[^].
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
modified on Tuesday, March 22, 2011 12:32 PM
|
|
|
|
|
Hi Luc,
I tried what you said as well but I only get see the first character in the C++ method, here is the code:
[DllImport("MyDll.dll", CharSet = CharSet.Unicode)]
public static extern int MyMethod(
string strA,
string strB,
string strC);
I took out the
[param: MarshalAs(UnmanagedType.LPStr)]
but it seems that this is needed
|
|
|
|
|
sorry, my mistake, if your native code wants ASCII, just say CharSet.ASCII . There is automatic marshaling that will allocate and later free buffers, translate the strings and everything for you.
Warning: you are not allowed to remember those string pointers (actually any pointer unless the object remains pinned) and use them after the function return!
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Hi Luc,
Thanks that works perfectly, you learn something new every day
|
|
|
|
|
I have developed a windows application in visual studio 2008.
This application connects to sql server 2005 Express by using a login in sql server.
As soon as the appplication runs (When the form is loaded), there is connection to the sql server, data is retrieved and displayed on the form.
In the clickonce, I just created the setup. After installtion from the CD onto the client machine, the form appears but obviously because there is no sql server 2005 express installed on the client, then the application fails to load data.
I am trying not to install the sql server 2005 express onto the machine and would like the clickonce to take care of the .mdf file.
Question
Using the clickonce procedure to create a setup onto a CD, is there an option to add the .mdf to the setup too? so that I do not have to install the sql server separately?
Note that I do NOT have .mdf in the solution of VS and the application uses a config file to connect to sql server as a connectionstring.
Thanks
modified on Tuesday, March 22, 2011 9:47 AM
|
|
|
|
|
You can add the .MDF all you want, but without Sql Server 2005 Express installed, the file is completely useless.
You simply have no choice. As for installing SQL Server Express with ClickOnce, read this[^].
|
|
|
|
|
I see.
In that case I can just do the following:
1- Install sql server 2005 express.
2- Run the setup from the CD as it is (Without the .mdf). There is a connectionstring in the code which points to the local sql server.
What do you think?
Thanks
|
|
|
|
|
Hi Dave,
Did you receive my email? Otherwise, can you email me at rajesh AT indiamvps DOT net?
Thanks.
"Real men drive manual transmission" - Rajesh.
|
|
|
|
|
Yes, I did. I don't respond to direct emails. I get too many of them from people wanting to be my friend for no reason other than for me to teach them everything they don't know.
No, I'm not a MS MVP anynmore, and no, I have no desire for the license at all. I don't even run antivirus on my machine.
|
|
|
|
|
OK, thanks for letting me know Dave.
"Real men drive manual transmission" - Rajesh.
|
|
|
|
|
Hi,
Please Haw can i pass a picture as parameter to Application C# ?
|
|
|
|
|
Do you mean how do you pass a picture as a command line argument to a Windows Forms application? You need to be far more specific in your questions.
|
|
|
|
|
I have:
1.. MFC application (application of test)
2.. C# dll ( ActiveX control : COM)
I have implimented method in the Dll that receive Object (which I think it works) with name AddContextMenu(string A_strCaption, Object A_Icon);
So what I need is to Load a picture from Hard Disc and pass it as parameter for this method.
this is some code c++ where I have to call and pass the picture :
MyCtrlActiveX->AddContextMenu(_T("Assign PN"), ?????);
|
|
|
|
|
Passing things like images across COM is not trivial.
I think you have control of both halves of the application, and your question is just about adding icons to context menus? You should pass the information that the C# control needs to construct the image, and create the image in C#, instead of trying to pass it across the bridge. (For example, store the icons as resources in the C# assembly and pass the name of the image to use.)
Your question is still not very specific, but I suspect it is a case of 'I wouldn't have started from here' and you should be able to find a good solution to your problem which doesn't require you to send complex objects across COM.
|
|
|
|
|
Try passing the HBITMAP handle, so you can get the image in .NET with Image.FromHBitmap, or pass the string containing the image path on the hard disk, so you can get the image in .NET with Image.FromFile.
|
|
|
|
|
can you explain more please.
|
|
|
|
|
|
Be more specific. I have no ideea what exactly you want.
Pass a filename to the app args[] so that it(the app) opens the image automatically? Like in double clik from desktop?
Or form another app? or From/To a DB?
All the best,
Dan
|
|
|
|
|
I have:
1.. MFC application (application of test)
2.. C# dll ( ActiveX control : COM)
I have implimented method in the Dll that receive Object (which I think it works) with name AddContextMenu(string A_strCaption, Object A_Icon);
So what I need is to Load a picture from Hard Disc and pass it as parameter for this method.
this is some code c++ where I have to call and pass the picture :
MyCtrlActiveX->AddContextMenu(_T("Assign PN"), ?????);
|
|
|
|
|
What kind of application? Console app? If so, just pass the filename as a command-line parameter and handle it in the code.
|
|
|
|
|
No, it is a windows application MFC and I should pass the Image as paralmter , not just the path.
thank you
|
|
|
|
|
I think you need to use System.Diagnostics.Process.StandardInput[^]
TVMU^P[[IGIOQHG^JSH`A#@`RFJ\c^JPL>;"[,*/|+&WLEZGc`AFXc!L
%^]*IRXD#@GKCQ`R\^SF_WcHbORY87֦ʻ6ϣN8ȤBcRAV\Z^&SU~%CSWQ@#2
W_AD`EPABIKRDFVS)EVLQK)JKQUFK[M`UKs*$GwU#QDXBER@CBN%
R0~53%eYrd8mt^7Z6]iTF+(EWfJ9zaK-iTV.C\y<pjxsg-b$f4ia>
-----------------------------------------------
128 bit encrypted signature, crack if you can
|
|
|
|
|
more explication please if you can.
|
|
|
|
|
Dear friends,
I have a window scheduler which pionts an exe.
This schduler failes while starting automatically where as if i run maunally, it is executed successfully.
Front End: DotNet 2.0
Back end: Oracle 9i
The error message which i get is
OCIEnvCreate failed with return code -1
I'm cluless.
Thanks & regards
SWARAN
|
|
|
|