日期:2014-05-18  浏览次数:21019 次

请教 如何在C#中 调用dll文件提供的对外接口~~~~一旦解决再追100
此动态链接库 的接口描述如下
int hwdev_exe (char * pDevinfobuff,unsigned long nDevinfolen,
  char * pSendBuff, unsigned long nSendLen,
  char ** pRecbuff, unsigned long pRecvlen,
  FunctotaldoneTp pFunctotalDone)

说明如下 pDevinfobuff为指向设备信息的指针
  nDevinfolen为存放设备信息缓冲区 的长度
  pSendBuff 为发送缓冲区首指针,来存放符合规则的命令、参数 、数据
  nSendLen 为发送缓冲区的长度
  pRecbuff 为接受缓冲区首指针,来存放各种命令的执行结果 
  pRecvlen 为接受缓冲区的长度
  pFunctotalDone 为回调函数指针,用于向调用着反馈执行进度

  其中FunctotaldoneTp 类型定义如下 typedef int (CALLBACK Functotaldonetp)(unsigned long total,unsigned long nDone)

请各位前辈传授一下再C#中调用此接口的方法,最好能写个调用此接口的大概的实例代码,或者给个调用接口的参考书之类的资料 万分谢谢

ps.此接口用的c指针,要加强此类知识 还烦请推荐点资料 谢谢

------解决方案--------------------
pDevinfobuff为指向设备信息的指针
--string,StringBuilder,byte*或者byte[]
nDevinfolen为存放设备信息缓冲区 的长度
--uint
pSendBuff 为发送缓冲区首指针,来存放符合规则的命令、参数 、数据
--string,StringBuilder,byte*或者byte[]
nSendLen 为发送缓冲区的长度
--uint
pRecbuff 为接受缓冲区首指针,来存放各种命令的执行结果
--byte**,看看文档吧,得知道它返回来的是什么样的数据
pRecvlen 为接受缓冲区的长度
--你的定义是unsigned long pRecvlen,为什么没有*呢,怀疑,没有*的话,也没法用来做返回值啊。
pFunctotalDone 为回调函数指针,用于向调用着反馈执行进度 
--delegate
------解决方案--------------------
外部DLL使用:
(1)加DLL引用
(2)转化一下类型 (这个DLL类库是用C++写的,下面是转化对照表)
(3)接下来,就当作C#方法使用.


C++ C#
WORD ushort
DWORD uint
UCHAR int/byte 一般用int代替,而如果需要严格对齐的话则应该用bytebyte 
UCHAR* string/IntPtr
unsigned char* [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
char* string
LPCTSTR string
LPTSTR [MarshalAs(UnmanagedType.LPTStr)] string
long  int
ulong uint
Handle IntPtr
HWND  IntPtr
void* IntPtr
int   int
int* ref int
*int IntPtr
unsigned int uint
COLORREF uint
------解决方案--------------------
int FunctotaldonetpMethod(int total,int nDone)
{
......
}

Functotaldonetp d = new Functotaldonetp(FunctotaldonetpMethod);
....

hwdev_exe(........,d);