这几天做一个下载程序.调用的是另外一家开发的DLL.VC++开发的.调用的时候有一些经验记录一下.以供大家参考.
首先给大家介绍个工具.经常使用C++的人一定都了解.查看DLL的工具Dependency Walker.使用它可以方便的查看DLL中的结构.再刚拿到DLL的时候,用这个工具,可以对这个DLL有个大致的了解.
OK,言归正传,开始
导入:
将你要使用的DLL放入Debug文件夹下,程序中如下
- [DllImport("JFtpLoad.DLL")]
- public static extern int JF_DownloadFile(int hFtpFile, string lpRemote, string czLocalPath);
如果是有返回值的话.调用时候应该加上out,或者ref参数
C++
- void JF_GetAntStatus(int hFtpFile, int iIndex, long* pOffset, long* pLeave);
C#调用
- [DllImport("JFtpLoad.DLL")]
- 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++
- #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#中通过如下放来捕获消息:
- protected override void DefWndProc(ref System.Windows.Forms.Message m)
- {
- try
- {
- switch (m.Msg)
- {
- //接收自定义消息 USER,并显示其参数
- case 0x0400 + 102:
- Downtimer.Stop();
- //关闭句柄
- JF_CloseJFtpFile(handle);
- message = string.Format("下载文件完成!,句柄为:{0},Lparam为:{1}",m.WParam, m.LParam);
- MessageBox.Show(message);
- break;
- case 0x0400 + 103:
- Downtimer.Stop();
- message = string.Format("失败!请重新检查链接!句柄为:{0},{1}", m.WParam, m.LParam);
- MessageBox.Show(message);
- break;
- default:
- base.DefWndProc(ref m);
- break;
- }
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
关于0x0400
MFC允许用户自定义消息,常量WM_USER(为0x0400)与第一个自定义消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移值。利用#define语句定义自己的消息,例如:
#define WM_USER1 WM_USER+0
#define WM_USER2 WM_USER+1