没有尝试过写DLL,一直都是用QT写点小例子,这篇主要是写给自己看的,希望自己以后不至于忘了曾经自己为了了解dll所做的努力。
我使用的环境是VC6, 跟普通的文件一样,利用创建文件向导,创建工程MFC AppWizard(dll) ,选择好路径, 命名, 选择默认选项,下一步, 完成, 编译后,这样一个空壳的dll就出来了。我们这里想在dll中导出一个打印输出hello world的函数void print()以供其他exe调用 。
1. 我按照上面的流程建立的dll工程名称叫testdll, 在文件路径下面会产生两个对应的文件, testdll.cpp 和 testdll.h , 在头文件里面, 我们需要定义所希望能够被其他程序所利用的函数,
所以我们在testdll.h中语句:#include "resource.h" 后面添加上一句:
extern "C" void __declspec(dllexport) print();
告诉编译器,这个函数是dll对外提供的函数。而在此同时,我们还需要在对应的testdll.cpp中提供函数的实现,我们就简单的实现以下内容
(添加到CTestdllApp theApp ; 后一行):
extern "C" void __declspec(dllexport) print(){
CString str = "hello world";
AfxMessageBox(str);
}
这样我们对外的函数,就写完成了,在此语句中 __declspec(dllexport) 是导出函数关键字,还可以导出类等其他的东西。编译链接过后,就会在工程目录下面,生成一个testdll.dll的文件,这个就是我们需要的dll文件。
2. 我们同样建立一个工程来测试这个dll,在文件向导的创建过程中,我们选择MFC AppWizard(exe) , 名为(testdll1) ,点击下一步, 完成。在资源对话框中, 主窗体上,双击确定按钮,进入到按钮事件的处理代码处,添加:
void CTestdll1Dlg::OnOK()
{
HMODULE hins = LoadLibrary("testdll.dll");
if(hins){
typedef void (*PROCTYPE)();
PROCTYPE myprint = (PROCTYPE)GetProcAddress(hins,"print");
(*myprint)();
}
FreeLibrary(hins);
}
编译,链接, 然后将开始生成的testdll.dll放置到此工程生成的exe路径下,运行此程序,点击确定按钮,就会调用dll中的print函数,弹出对话框"hello world"了。