[问题] 关于引用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