TOPIC:
动态链接库在codeblocks上的创建和使用
创建:
新建工程,工程类型选择动态链接库,完成之后自动生成基本两个文件(一个头文件,一个CPP文件)。简单的功能架构以及要在哪里声明,哪里写实现,怎么写,这些在自动生成的文件中都已经有了,那这样你写出来你想要的动态链接库就很容易了。
不要选择运行(运行会提示:You must select a host application to "run" a library.),这里进行编译。然后到工程bin文件里边去找生成的DLL文件。
使用:
举个栗子
//load dll
HINSTANCE ***dll;
char _filepath[200] = {};
getcwd(_filepath,200);
strcat(_filepath,"\\_***dll.dll");
***dll = LoadLibrary(_filepath);
if(***dll==NULL)
{
FreeLibrary(***dll);
return -1;
}
//get function "***Enter"是dll的导出函数
typedef void (* dll***Enter)(); //最前面的*是函数指针
dll***Enter ***Enter;
***Enter = (dll***Enter) GetProcAddress(***dll,"***Enter");
if(***Enter==NULL)
{
FreeLibrary(***dll);
return -1;
}
//execute function,get"start!"
try{
***Enter();
}catch(exception e){
cout<<"exception:execute function occur error";
}
FreeLibrary(***dll);
addition:
创建时候也可以自定义dll加载和撤销时候要执行的事件,这个需要你来自修改DLLMain函数内容。
栗子:
//DllMain
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
cout<<"ATTACHKDLL Initializing!\n";
break;
case DLL_PROCESS_DETACH:
// detach from process 进行清理工作
cout<<"DETACHDLL Terminating!\n";
break;
case DLL_THREAD_ATTACH:
// attach to thread
break;
case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}