兄弟们来帮忙看看啊。调用外部dll,且该dll函数中带有指针
因为没有用过其他的诸如:CB、VC做过开发,所以对.NET里的平台调用不是很清楚。最近在调用明华读卡器的驱动时,看到他们提供的函数中会用到指针。如
int csc_4428(int icdev, int len, unsigned char* p_string)
那么在c#中调用这个函数该怎么调用?我这样写对吗?
声明
[DllImport("Mwic_32.dll", SetLastError=true)]
public static extern int csc_4428(int icdev,int len,Byte* p_string)
调用:
int x = csc_4428(icdev,len,&p_string);
这样调用的时候需要打开不安全代码的选项,有没有其他的方法?
--------------------编程问答-------------------- 我顶 --------------------编程问答-------------------- 可以这样定义:(指针类型一般都用IntPtr代替,但是对于字符串或字符串指针可以直接用string类型代替)
[DllImport("Mwic_32.dll", SetLastError=true)]
public static extern int csc_4428(int icdev,int len,string p_string) --------------------编程问答-------------------- UP --------------------编程问答-------------------- up --------------------编程问答-------------------- 用StringBuilder 类型试试 ,
调用时StringBuilder变量要给足够空间 .
[DllImport("Mwic_32.dll", SetLastError=true)]
public static extern int csc_4428(int icdev,int len, StringBuilder p_string)
--------------------编程问答-------------------- [DllImport("Mwic_32.dll", EntryPoint="csc_4428", SetLastError=true, CharSet=CharSet.Auto, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
public static extern int csc_4428(IntPtr icdev,int len,[MarshalAs(UnmanagedType.LPArray)] byte[] data_buffer);
--------------------编程问答-------------------- 感谢大家对小弟的帮助,由于现在手上没有卡机,没有办法测试。
我到网上看了一下相关的说明,并仔细看了一下其他程序下的示例。
无非是几种答案:
1.CSharpEx兄弟说的:
[DllImport("Mwic_32.dll", EntryPoint="csc_4428", SetLastError=true, CharSet=CharSet.Auto, ExactSpelling=true, CallingConvention=CallingConvention.StdCall)]
public static extern int csc_4428(IntPtr icdev,int len,[MarshalAs(UnmanagedType.LPArray)] byte[] data_buffer
但是unsigned char* 似乎是字符型地址,byte是数字,这样行的通吗?而且CharSet使用auto可以吗?这种函数是不是使用Ansi更为合适一些。
2.CityGrass兄弟说的,使用StringBuilder。但是我在这个见鬼的dll使用说明上看到这样的说明:
int swr_dvsc(int icdev,int len,unsigned char *databuff)
说明:改写设备密码
调用:
icdev: 通讯设备标识符
len: 密码字符串长度,其值为3
databuff: 存放要写入的密码字符串
返回:<0 错误 =0 正确
举例: unsigned char databuff[3]={’a’,’b’,’c’};
st=swr_dvsc(icdev,3,databuff);
看他的例子又让我觉得unsigned char *databuff 这应该是个数组?那么stringbuilder搞得定吗?
是不是用
[MarshalAs(UnmanagedType.LPArray)] string[] data_buffer
更好一点?
小弟对这种基础知识很模糊,希望大哥们能给个准确的说法。
--------------------编程问答-------------------- 顶了,只会用VC开发...
补充:.NET技术 , C#