日期:2014-05-17  浏览次数:20866 次

c#调用c++做的dll遇到的问题
本帖最后由 starlistener 于 2011-01-10 16:03:10 编辑
1。dll中有很多常量变量的定义,我在c#程序里是不是要重新把他们按c#的语法定义一遍呢。
2. 其中的函数每个都是以winapi xxxx 的形式,我采用DllImport调用的时候函数名还要不要winapi ,我试了下,名称是winapi xxxx() 的话编译不过,提示分号要打在括号前面,名称只是xxxx()编译就能过, 这个是神马情况。
3.其中有些函数的参数是带星的指针,这种参数在c#中该如何处理。
拜托拜托,大家指点指点,谢谢谢谢,新年大吉

------解决方案--------------------
1.只需要你在调用DLL中用到一些结构就行了,比如结构体,还有静态全局变量,你可以根据需要重新定义,也可以直接以参数形式调用
2.不需要,C#调用DLL需要用到DllInport,例如
VQVION_API int VQConfig(int nWidth,int nHeight)
在C#中定义为
[DllInport("XXX.dll",EnterPoint="VQConfig")]
public static extern CSharpVQConfig(int nWidth,int nHeight);
3.函数的指针参数,这里有4中方式
  1.引用传递,传递参数时使用ref
  2.使用伪指针Intptr
  3.使用不安全的指针操作,可以直接使用C++的类似指针操作,该操作需要将项目属性设置为“允许不安全代码”
  4.外部定义非委托内存,将该内存指针地址转化为4个字节地址,传递进去
------解决方案--------------------
dll中有很多常量变量的定义,如果常量有做参数,需要定义,但不会有人把常量当作函数参数来传递的,可以说你不要定义。
托管调非托管用[DllImport]引用dll,
其中有些函数的参数是带星的指针,这种参数在c#中该如何处理,那说明原函数是指针形参,C#原函数必须是引用类型参数传过去,我只用过ref,
Intptr没成功过。


------解决方案--------------------
private static extern int Com_Init(int lPort, int lspeed, IntPtr hWnd);
private static extern int Radio_GetInf(ref int lChannelSpeed, StringBuilder PTT,  
StringBuilder IPAddress, StringBuilder ARQnum);
private static extern int Radio_Setup(int lCommandType, int lParam, StringBuilder pchIP);
private static extern int Com_Exit();

long WINAPI DataSend( RadioData_RxTx *pRadioData_RxTx, int TypeFlag=0);
这个函数最奇怪了,竟然没有导出,还和那些到处的函数放到一起。
如果你要使用这个函数的话,你就需要定义RadioData_RxTx 这个结构体,实在不行可以使用IntPtr代替。