[这个贴子最后由x86在 2005/09/11 00:26am 第 1 次编辑]
[watermark]哈哈,原理就不多说了,,请参阅本论坛的其他资料,发现网上关于动手制作的介绍比较的少,所以简单地写一个在vc6.0下制作一个简单的Non-MFC Dll的过程!!之所以选这种类型的是因为觉得他最通俗好懂,能够很快地制作其他的通用的dll。
准备工作:当然MS 的vc6.0啦。
新建-->project-->Win32 dynamic link library,project name假设为:firstdll。
选择an empty dll。然后finish。
然后新建-->c/c++source file name假设为1,然后ok。开始写代码:
#include
#include
extern "C" __declspec(dllexport) void Test(void);
//使用extern "c"使得在c++中也可以调用
//这里声明一个可以导出的函数名
BOOL APIENTRY DllMain( //dll的入口,相当于WinMain
HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{//每当调用dll时都先执行入口函数,在结束调用的时候也要执行入口函数
//除非用terminatethread和terminateprocess
switch (ul_reason_for_call)//对被调原因说明的标志
{
case DLL_PROCESS_ATTACH://进程调用
case DLL_THREAD_ATTACH://线程调用
case DLL_THREAD_DETACH://线程停止调用
case DLL_PROCESS_DETACH://进程停止调用
break;
}
return TRUE;
}
void Test()//我们可以调入的函数
{
MessageBox(NULL,"First Dll!","WARNING",MB_OK|0x0030);
}
ok,编译通过!想运行,会提示输入一个调用他的exe文件。不管他,先取消了。这时候在debug文件夹里看到了firstdll.dll文件了。。下面我们来写一个调用程序。先关闭了这个工作区间。
然后 新建-->c/c++ source file,假设文件名为call.然后ok,开始写代码:
#include
#include
void main()
{
typedef void(*send)();
send call;
HINSTANCE Pdll;
Pdll=LoadLibrary("firstdll.dll");//获得dll的入口地址
if(Pdll==NULL)
{printf("get dll failed!\n");
exit(0);
}
else
call=(send)GetProcAddress(Pdll,"Test");//获得函数的指针
call();
FreeLibrary(Pdll);
}
然后编译运行,,哈哈,,可是却是get dll failed! 呵呵,因为firstdll.dll并不在当前文件夹或者系统文件夹或者系统的环境变量地址的下面。。我们把firstdll.dll复制到程序的文件夹下,然后再运行程序,,成功了!!!!
[/watermark] |