[問題] 關於引用C++ dll的變數類別

作者: ab710912 (Leanne)   2021-11-29 11:50:49
工作上收到一份dll
他給的文件方法是
SnmpStatus(int& DeviceStatus,int& PrinterStatus,char* PrinterError);
所以我採用
[DllImport("MPrinterSnmp.dll", EntryPoint = "SnmpStatus", CallingConvention
= CallingConvention.StdCall,CharSet =CharSet.Unicode)]
public static extern int SnmpStatus(out int DeviceStatus, out int
PrinterStatus,ref StringBuilder PrinterError);
可是一呼叫 程式就直接結束工作,連例外都沒跳出
曾經有一次 把 StringBuilder改成Char有成功取得值一次
但是後來再試就一樣直接跳掉
StringBuilder 改試過 String、byte[2]、String[2]、IntPtr、char、char[2]
都是直接跳掉
另外 他有附他的.h給我 裡面的方法是
extern "C" __declspec(dllexport) int __stdcall SnmpStatus(int
&DeviceStatus,int &PrinterStatus,char *PrinterError);
*和&的位置和文件的位置有些微不一樣 不知道有沒有差別
作者: Litfal (Litfal)   2021-12-01 16:33:00
有這種需求我是用Marshal.AllocHGlobal啦,不用fixed或StructureToPtr,我是用在圖像處理,C#端也有一些處理函數,對速度斤斤計較才這樣搞
作者: s4300026 (s4300026)   2021-12-01 15:47:00
回Litfal, 我是指*或是**,因為unsafe可以使用native ptr,但c#並沒有對應的new delete關鍵字。確實我後來是在api中多宣告了new/delete的方法來解決。只是我在想,有沒有在外部new好再丟入dll內的方式。https://i.imgur.com/kYtXkGm.jpg我目前是這樣寫,不是走dllimport的方式,但對於 & 和 %那裡不知道要怎麼轉會更好。
作者: Litfal (Litfal)   2021-12-01 13:51:00
樓上是指IntPtr?通常是C library開api負責new和del吧然後C++的&不一定是out,用ref比較一致,雖然我覺得在api裡面用&還頗……特殊的,大部分都會用一致性更高的*你在丟StringBuilder和char[ ]時不需要ref,C#丟物件預設就是傳址了StringBuilder要初始空間給他用,char[]和byte[]也是一樣。開大一點,拜託,能跑再來考慮怎麼省他api用char,應該不會是Unicode,注意一下
作者: testPtt (測試)   2021-12-01 13:38:00
NativeMemory Class
作者: s4300026 (s4300026)   2021-12-01 12:05:00
話說好奇問一下,undafe的native pointer要怎麼new 和delete?
作者: ssccg (23)   2021-11-29 13:02:00
要用IntPtr,然後用Marshal.PtrToStringAnsi這函式看起來是傳char*(=IntPtr)進去,然後裡面會把結果直
作者: s4300026 (s4300026)   2021-11-30 12:28:00
我覺得是 char 跟 wchar 的問題。 String^ 是wchar.話說為什麼不自己寫wrapper class,要用dllimport你char會在dll裡面改變大小嗎? 你怎麼保證不會overflow
作者: testPtt (測試)   2021-12-01 08:43:00
unsafe

Links booklink

Contact Us: admin [ a t ] ucptt.com