Re: PInvoke Marshalling....



Nicholas,

Excellent, thanks for the prompt reply!

pData is a buffer that I create, then pass into the function to populate.
Does the parameter as a StringBuilder marshall this data correctly?

Thanks.
Dan.

"Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote in
message news:ecx5T6XFIHA.280@xxxxxxxxxxxxxxxxxxxxxxx
Daniel,

Actually, it's not pretty obvious. In C++, long corresponds to a
32-bit integer, which in C#, is an int. Also, you should declare how your
strings are marshaled in the DllImport attribute. All-in-all, your
declaration should look like this:

[DllImport("Dependencies\\SNAPI.DLL", CharSet=CharSet.Ansi)]
public static extern int SNAPI_SetVersionBuffer(IntPtr DeviceHandle,
StringBuilder pData, int max_length);

Also, if the pData parameter is not going to be written to by the API
function, you can pass it as a string.


--
- Nicholas Paldino [.NET/C# MVP]
- mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx


"Daniel Bass" <danREMOVEbass@xxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:u83rn0XFIHA.1056@xxxxxxxxxxxxxxxxxxxxxxx
Greetings!

I'm trying to call this method in a c# app...

SNAPIDLL_API int __stdcall SNAPI_SetCapabilitiesBuffer(HANDLE
DeviceHandle, unsigned char *pData, long max_length);

So far I've got this:
[DllImport("Dependencies\\SNAPI.DLL")]
public static extern int SNAPI_SetVersionBuffer(IntPtr DeviceHandle,
StringBuilder pData, long max_length);

Keep getting a PInvokeStackImbalance error and I think it's the 2nd
paramter pData because I've referenced the device handler and the long
typedef is pretty obvious.

For the 2nd paramter I've tried the following without success:
byte[]
char[]
string
StringBuilder
[MarshalAs(UnmanagedType.AnsiBStr)] string

HELP!
Thanks.
Dan.





.



Relevant Pages

  • Re: PInvoke Marshalling....
    ... "A command function returns immediately to the host application... ... pData is a buffer that I create, then pass into the function to populate. ... Does the parameter as a StringBuilder marshall this data correctly? ... public static extern int SNAPI_SetVersionBuffer(IntPtr DeviceHandle, ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: PInvoke Marshalling....
    ... StringBuilder will cause the data to be marshaled back to you correctly. ... pData is a buffer that I create, then pass into the function to populate. ... Does the parameter as a StringBuilder marshall this data correctly? ... public static extern int SNAPI_SetVersionBuffer(IntPtr DeviceHandle, ...
    (microsoft.public.dotnet.languages.csharp)
  • Exception on call to unmanaged dll. Attempted to read or write protected memory. This is often an i
    ... CallingConvention = CallingConvention.Cdecl)] ... public static extern void Cleanup; ... public static extern int CreateContext(ref int context, ... StringBuilder host_addr, int host_port, int time_out, StringBuilder ...
    (microsoft.public.dotnet.framework.interop)
  • Re: Urgent! Passing C# string into C++ char*
    ... public static extern int copyString(string strIn, StringBuilder strOut); ... with EntryPoint using the ordinal number of your exported function. ...
    (microsoft.public.dotnet.framework.interop)
  • Re: newbie how to call this C function from C#
    ... >public static extern int my_function(StringBuilder in, ... keyword. ...
    (microsoft.public.dotnet.framework.interop)

Loading