我有一個問題PInvoking本地函數從C++ ...我有PInvoked所有其他本機函數沒有問題(參數是非常簡單的轉換)。下面是C++原型及其在C++中使用:PInvoke C++函數在C#中使用
DECL_FOOAPIDLL DWORD WINAPI FOO_Command(
VOID *Par, //pointer to the parameter(s) needed by the command
DWORD Len, //length of Parameter in bytes
DWORD Id //identification number of the command
);
用法:
static DWORD DoSomething(WCHAR *str)
{
DWORD len = (wcslen(str)+1)*sizeof(WCHAR);
DWORD ret = FOO_Command((VOID *)str,len,FOOAPI_COMMAND_CLOSE);
return(ret);
}
我的C#的PInvoke:
[DllImport("FOO.dll")]
static public extern uint FOO_Command(IntPtr par, uint len, uint id);
private void DoSomething()
{
string text = "this is a test";
IntPtr ptr = Marshal.StringToHGlobalUni(text);
uint hr = FOO_Command(ptr,255, FOOAPI_COMMAND_CLOSE);
Marshal.FreeHGlobal(ptr);
}
1)這是對的PInvoke這個API的正確方法是什麼? 2)我怎麼能得到ptr的大小,我有255作爲parm?
以上的工作,但我是新來的PInvoke和「本地」的世界......
謝謝
你說謊有關的字符串長度 - 這顯然更短超過127個字符 - 但只要DECL_FOOAPIDLL宏指定了__stdcall調用約定,它就是正確的。 – ildjarn
您遇到的問題是什麼? –
我不能確定如果我可以更好地設置PInvoke c#api,以便我不需要將字符串編組到一個指針......但是在經過一些研究之後,我認爲它是唯一一種看到指針在使用後需要被銷燬的方法...我應該使用Marshal.sizeof(ptr)來獲得正確的字符串長度嗎?我簡單地嘗試了(text.length + 1),但只有一半的字符串是由C++ api接收的。 – devHead