2011-09-08 72 views
1

我有一個C++ DLL,我試圖用C#接口。我無法訪問DLL源代碼,因此無法更改。其中一個我需要調用的方法中包含一個指向一個unsigned long:試圖將C++指針無符號長整型到一個C#ulong

int __stdcall Foo(FooHandle messageHandle, unsigned long* tag, char* part, char* value) 

我已經創建了同樣的方法簽名測試DLL的項目,所以我可以嘗試算出這個,但我沒有成功能讓DLL改變指針所引用的無符號長整型的值,並在C#端返回該值。 C#的側聲明:

[DllImport("Foo.dll", EntryPoint = "Foo", CallingConvention = CallingConvention.StdCall)] 
    public static extern int Foo(int messageHandle, IntPtr tag, StringBuilder part, StringBuilder value); 

當我做從C#中的呼叫,然後嘗試將IntPtr的轉換的Int32或Int64的,我得到一個零。我已經在這裏和網上搜索一般以及MSDN,似乎無法找到解釋如何做到這一點。我認爲char *將是最難的部分,但StringBuilder正常工作。

如何使用改變指針傳遞的無符號長整型值的C++ DLL?

任何幫助,將不勝感激。謝謝。

+0

也許UIntPtr結構:http://msdn.microsoft.com/en-us/library/system.uintptr(v=VS.100)。 aspx可以在這裏提供一些幫助嗎? – Oxymoron

+0

您沒有發佈如何獲取標記的簽名值的值。我會猜測代碼是錯誤的。當然你的簽名是不一樣的,標籤是一個基於你的C++簽名的無符號長引用。 –

回答

4

只要使用由裁判通過一個uint:

public static extern int Foo(int messageHandle, ref uint tag, StringBuilder part, StringBuilder value); 
+0

謝謝大衛,它的作品!現在看起來這麼簡單,我無法把它指向它。 – SSutcliffe

+0

你能幫忙嗎, long T_main(long Ref_Toc,unsigned long * Input_Toc,long Input_Toc_count,char * Sdf_Path,char Positive_Matching,int Channel_Option,unsigned int * Output_Tocs,unsigned char * Error_Value) – Aravind

+0

@Aravind不響應對另一個問題的答案急急地寫了評論 –