2011-09-22 67 views
1

我正在爲管理OCR設備的DLL編寫包裝。該DLL有其簽名類似於下面的方法:將標準C++字符串編組爲C#字符串的問題

unsigned long aMethod(char **firstParameter, char **secondParameter); 

返回amethod方法字符串指針所有參數。

C#寫了這個簽名......這幾乎是功能:

[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl, 
    CharSet = CharSet.Auto)] 
static unsafe extern ulong aMethod(ref IntPtr firstParameter, 
    ref IntPtr secondParameter); 

我做這樣的調用:

aMethod(ref firstParameter, ref secondParameter); 

編組和解組相關的字符串作爲完成這裏:

Marshal.PtrToStringAnsi(firstParameter) 
Marshal.PtrToStringAnsi(secondParameter) 

很明顯,這個編組是根據D LL的API約定。

現在,編組過程有問題。假設設備有一個帶有這個字符串「abcdefg」的輸入。如果我使用純C++代碼中的DLL,我會得到「abcdefg」作爲輸出。但是,如果我使用的是C#簽名,則字符串會丟失其第一個字符,並且看起來像「bcdefg」。

發生了什麼事?我如何修復C#方法?

+1

我盲目飛行(不必爲我鍵入此編譯器的訪問),但仔細檢查你的C#簽名的返回類型。 你有它作爲'ulong',這是64位。 C方法簽名是'unsigned long'。大小因體系結構而異,但對於Visual C++,「unsigned long」是32位。我不明白這是如何引起你所問的問題的,但還有一件事要檢查並確保你有正確的。 –

+0

完成SwDevMan81!把它寫成答案,我會給你支票! – JPCF

+0

@Juan - 好吧,我將它添加爲答案:) – SwDevMan81

回答

0

假設這些參數從應用程序給你,爲什麼不直接使用:

[DllImport(aDll.dll, CallingConvention = CallingConvention.Cdecl, 
    CharSet = CharSet.Auto)] 
static unsafe extern uint aMethod(out string firstParameter, 
    out string secondParameter); 

如果你希望他們去兩種方式,你可以使用一個ref StringBuilder有預分配的大小(你應該如果C函數希望你管理自己的內存,也可以使用它 - 你沒有說)。