2009-11-02 69 views
1

所以我試圖調用我的非託管C++ DLL中的函數。PInvoke在Windows Mobile平臺

void foo(char* in_file, char * out_file) 

在我的C#應用​​程序,我宣佈了相同的功能,

[DllImport("dll.dll")] 
public static extern void foo(byte[] in_file, byte[] out_file); 

實際參數我通過一個ASCII編碼器,像這樣

byte[] param1 = Encoding.ASCII.GetBytes(filename1); 
byte[] param2 = Encoding.ASCII.GetBytes(filename2); 
foo(param1, param2); 

一切正常,除了當長度param1是0或36或72個字符(字節)。然後出於某種原因,DLL報告接收到的長度爲1,38,73,並在最後顯示0x16字符。

我浪費了半天的時間試圖調試並理解爲什麼會發生這種情況。有任何想法嗎? 36的倍數有什麼意義?

編輯/解決方案

後,我張貼這一個可能的答案讓我吃驚。通過在將字符串轉換爲字節數組之前將空字符0x0附加到字符串的末尾,我已消除了該問題。雖然我不確定這是否是設計。

回答

2

你已經偶然發現了答案 - 無處傳遞給函數的長度。

你需要仔細思考你正在運行的功能以及ASCII是否真的是你想要的。

你可能真的想這樣,沒有ASCII編碼必要和空終止的編組類型明確:

[DllImport("dll.dll")] 
public static extern void foo(
    [MarshalAs(LPStr)] string in_file, 
    [MarshalAs(LPStr)] string out_file); 

但檢查您的FOO()的實現,並確保你明白你真的希望傳遞英寸