2012-06-29 108 views
0

我有一個問題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和「本地」的世界......

謝謝

+0

你說謊有關的字符串長度 - 這顯然更短超過127個字符 - 但只要DECL_FOOAPIDLL宏指定了__stdcall調用約定,它就是正確的。 – ildjarn

+0

您遇到的問題是什麼? –

+0

我不能確定如果我可以更好地設置PInvoke c#api,以便我不需要將字符串編組到一個指針......但是在經過一些研究之後,我認爲它是唯一一種看到指針在使用後需要被銷燬的方法...我應該使用Marshal.sizeof(ptr)來獲得正確的字符串長度嗎?我簡單地嘗試了(text.length + 1),但只有一半的字符串是由C++ api接收的。 – devHead

回答

1
private void DoSomething() 
{ 

    string text = "this is a test"; 
    IntPtr ptr = Marshal.StringToHGlobalUni(text); 

    uint hr = FOO_Command(ptr, (text.Length + 1) * 2, FOOAPI_COMMAND_CLOSE); 

    Marshal.FreeHGlobal(ptr); 

} 
+0

您能否解釋* 2?... – devHead

+1

* 2是爲了說明UTF-16字符單位爲2個字節寬的事實。 C++代碼使用'* sizeof(WCHAR)'來實現相同的效果。 –

+0

對不起,花了這麼長時間,謝謝 – devHead