调用DLL的方法(验证通过)

来源:互联网 发布:打印机驱动for mac 编辑:程序博客网 时间:2024/05/18 10:39

发信人: AppleII (干涩的年华), 信区: Programming
标  题: 调用DLL的方法(验证通过)
发信站: 日月光华 (2004年08月04日13:22:49 星期三), 站内信件

网上的很多代码实际验证都不一定能过。下面的这个文章中,如何调用
那部分我是在VC6上验证过的,所以贴上来,帮助广大和我一样的菜鸟。

http://www.ipx.cn/html/c/20040304/index/200434134531.html

VC中DLL的创建及调用方法

此中只有实际才操作,而无相关理论
2      DLL的创建
首先,用VC集成开发界面中的“新建”,新建一个项目。无论是VC6.0还是VC.NET,都有
建立DLL项目的选项。只不过有些稍有不同,例如VC.NET中就有ISAPI DLL,扩展存储过
程DLL等,这些都不在讨论的范围。例如我们建立了一个用静态连接MFC库的DLL项目,名
称为mydll
然后,编辑mydll.cpp文件,在其中加入我们自己的函数void go()。注意,不需要在my
dll.h中声明它,而需要将函数头变成如下样子:
extern “c” __declspec(dllexport) void go()
{
//code……
}
dllexport表示这个函数是由外部调用的。
由于是否带参数,要影响到外部调用的方式,因此,我们再声明一个带参数的函数:
extern “c” __declspec(dllexport) void went(CString str)
{
//code……
}
OK,下面编译连接形成mydll.dll文件。
2      DLL的调用
好,下面我们就用VC写个程序调用它。在调用的函数中,首先要获得DLL的句柄,有如下
语句:
HINSTANCE     dllinstance;
dllinstance=::LoadLibrary(strDllUrl);
if(dllinstance==NULL) AfxMessageBox("can't open dll file");
   其中strDllUrl是mydll.dll路径的字符串,这样程序才能找到它。::LoadLibrary获
得参数标识的DLL文件的句柄。
    获得句柄后,下面要获得函数地址以便执行它。有如下语句:
    FARPROC  proc;
    proc=GetProcAddress(dllinstance,"go");
     if(proc==NULL) AfxMessageBox("can't find function");
     else proc();
FARPROC是一个远程过程指针,通过GetProcAddress获得函数的地址。它的两个参数就是
dll文件句柄和函数的名字了。
然后FARPROC就可以和go一样的使用了,它就是go ,go 就是它。
而对于带参数的DLL中的函数,调用方法有所不同。因为对函数的调用是通过对它地址的
引用进行的,这样,传入参数对不对,在函数调用程序的编译和联接过程中,无法知道
其正确性。因此,要在调用程序中对DLL中带参数的函数做个声明,如mydll中的went,我
们要做个声明如下:
typedef void (FAR __cdecl *MYWENT)(CString);
然后以类型MYWENT声明变量既可调用,如下:
    MYWENT myproc;
    myproc =(MYWENT)GetProcAddress(dllinstance,"go");
     if(myproc ==NULL) AfxMessageBox("can't find function");
     else myproc (“o-----yeah---------”);
注意声明的时候呢,由于DLL中WENT的定义为C语言调用规范,因此MYWENT前一定要用__
cdecl,而VC中常用的__stdcall是PASCAL调用规范,不可以的。一定要注意。


--
AppleII曾经是最广泛使用的电脑,使用6502 CPU,内存在百十K水平.通常无硬盘,有1到2个
5"软驱,配绿色或彩色显示器,无鼠标. 我用过,15年前.
我用过的另一种低档电脑是LASER310.当然也是在15年前了.
※ 来源:·日月光华 bbs.fudan.edu.cn·[FROM: 10.100.178.160]
※ 修改:·AppleII 於 08月04日13:23:05 修改本文·[FROM: 10.100.178.160]