C#中调用C++DLL笔记

 这几天做一个下载程序.调用的是另外一家开发的DLL.VC++开发的.调用的时候有一些经验记录一下.以供大家参考.

 

首先给大家介绍个工具.经常使用C++的人一定都了解.查看DLL的工具Dependency Walker.使用它可以方便的查看DLL中的结构.再刚拿到DLL的时候,用这个工具,可以对这个DLL有个大致的了解.

 

OK,言归正传,开始

 

导入:

 

将你要使用的DLL放入Debug文件夹下,程序中如下

  1. [DllImport("JFtpLoad.DLL")]
  2.         public static extern int JF_DownloadFile(int hFtpFile, string lpRemote, string czLocalPath);

如果是有返回值的话.调用时候应该加上out,或者ref参数

 

C++

  1. void  JF_GetAntStatus(int hFtpFile, int iIndex, long* pOffset, long* pLeave);

C#调用

  1. [DllImport("JFtpLoad.DLL")]
  2.         public static extern void JF_GetAntStatus(int hFtpFile, int iIndex, out int pOffset, out int pLeave);

附上一些类型转化:

C++与.NET中基础类型的对应及转化
非托管 C 语言类型 托管类名 说明
HANDLE void* System.IntPtr 32 位
BYTE unsigned char S ystem.Byte 8 位
SHORT short System.Int16 16 位
WORD unsigned short System.UInt16 16 位
INT int System.Int32 32 位
UINT unsigned int System.UInt32 32 位
LONG long System.Int32 32 位
BOOL bool System.BOOL 8 位
DWORD unsigned long System.UInt32 32 位
ULONG unsigned long System.UInt32 32 位
CHAR char System.Char 用 ANSI 修饰。
LPSTR char* System.String 或 System.StringBuilder 用 ANSI 修饰。
LPCSTR Const char* System.String 或 System.StringBuilder 用 ANSI 修饰。
LPWSTR wchar_t* System.String 或 System.StringBuilder 用 Unicode 修饰。
LPCWSTR Const wchar_t* System.String 或 System.StringBuilder 用 Unicode 修饰。
FLOAT Float System.Single 32 位
DOUBLE Double System.Double 64 位

 

返回消息捕获:

有的DLL会返回一些信息需要C#来捕获的.我们通过一下方法来实现:

C++

  1. #define WM_JFTP_TASK_COMPLETE   (WM_USER+102)

WM_USER 是windows自定义消息.一般一股是+几后再用。
如:#define WM_SHIT WM_USER+1

也就是说WM_USER是个分水岭,一般系统消息到不了这个数.

WM_USER + n 这个 n不能够重复.例如+1已经被定义为WM_SHIT那么就不能再定义#define WM_DOG WM_USER + 1.可以任意设置n就是不能重复.

 

C#中通过如下放来捕获消息:

 

  1. protected override void DefWndProc(ref System.Windows.Forms.Message m)
  2.         {
  3.             try
  4.             {
  5.                 switch (m.Msg)
  6.                 {
  7.                     //接收自定义消息 USER,并显示其参数 
  8.                     case 0x0400 + 102:
  9.                         Downtimer.Stop();
  10.                         //关闭句柄
  11.                         JF_CloseJFtpFile(handle);
  12.                         message = string.Format("下载文件完成!,句柄为:{0},Lparam为:{1}",m.WParam, m.LParam);                        
  13.                         MessageBox.Show(message);                        
  14.                         break;
  15.                     case 0x0400 + 103:
  16.                         Downtimer.Stop();
  17.                         message = string.Format("失败!请重新检查链接!句柄为:{0},{1}", m.WParam, m.LParam);
  18.                         MessageBox.Show(message);
  19.                         break;
  20.                     default:
  21.                         base.DefWndProc(ref m);
  22.                         break;
  23.                 }
  24.             }
  25.             catch (Exception ex)
  26.             {
  27.                 MessageBox.Show(ex.Message);
  28.             }
  29.         }

关于0x0400

 

MFC允许用户自定义消息,常量WM_USER(为0x0400)与第一个自定义消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移值。利用#define语句定义自己的消息,例如:
  #define  WM_USER1  WM_USER+0
  #define  WM_USER2  WM_USER+1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值