创建和使用dll动态链接库(dll系列一)

来源:互联网 发布:易语言源码大全下载 编辑:程序博客网 时间:2024/04/30 18:38

简单先讲下建立win32下的dll和隐式链接DLL的方法

 

如何建立win32的dll:

 

主要在2个部分:

首先在.h头文件中声明一个要被外部使用的函数,如extern "C" _declspec(dllexport) int sum(int a,int b);

然后在cpp文件里定义相应的函数

 

int sum(int a,int b){

return a+b;

}

这里你也可以添加DllMain作为dll入口

具体见下:

 

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)

{

    switch (fdwReason)    

    {    

    case DLL_PROCESS_ATTACH:

        printf("> process attach of dll/n");

        break;

 

    case DLL_THREAD_ATTACH:

        printf("> thread attach of dll/n");

        break;

 

    case DLL_THREAD_DETACH:

        printf("> thread detach of dll/n");

        break;

 

    case DLL_PROCESS_DETACH:

        printf("> process detach of dll/n");

        break;

    }

    return TRUE;

}

 

 

这里写了点代码,主要是判断DWORD 的参数,来判断访问所处状态,比如DLL_PROCESS_ATTACH,

MSDN上这么解释:

The DLL is being loaded into the virtual address space of the current process as a result of the process starting up or as a result of a call to LoadLibrary. DLLs can use this opportunity to initialize any instance data or to use the TlsAlloc function to allocate a thread local storage (TLS) index.

也就是说在dll被加载时发生的

 

更多可去查看msdn上的DllMain解释。

 

这样你就编写好一个dll了,只要将他进行build成dll,然后把相应的dll和lib拿出来,他就成了一个dll链接库了。

 

------------------------------------------------------------------------------------------------------------------------

 

通过隐式链接来使用dll:

这个也比较简单,将dll和lib复制放在程序相应目录,具体位置不是特别有要求,当然两个文件不要分开,

然后就是在程序里如何调用了。你可以当dll为普通函数,所以肯定要先声明的,其实他和普通函数声明基本一样,唯一区别是,他需要使用这样的一句话来说明他是来调用dll中的函数,如下

extern "C" __declspec(dllimport) sum(int a,int b);

注意这里__declspec后面是的dllimport不是dllexport哦~!,这样好了后似乎就可以用了

其实不然,因为程序还不知道具体到哪里去找相应dll,那你要做的就是到配置里添加下,路径为:project ->setting...->link->Object/library modules里添加那个lib文件路径,是相对于你的exe程序的路径,当然事实上不一定是相对于exe的路径,因为程序时会去寻找system等一些文件夹的文件的,但是至少你一定要明确告诉程序到哪里可以找到lib

 当然你也可以不一定要setting中设置,也可以使用

#pragma comment(lib,"Debug/perdll")

来再程序中加载相应的dll,这样的好处就是你可以再不同的编译器里都可以使用,

注意这里的第2个参数是致命dll的位置的,我这里使用了/,也可以使用//。

 

到这里我们也就可以使用dll文件了。

 

不明白的话那我。。。。。

先讲这些,其他的比如显式链接稍后推出!

 

 

 

显示链接使用:

这个也比较简单,也更有用更好用,比较有效率,减少程序代码量及升级更改。

方法:

主要是使用3个函数。LoadLibrary(),FreeLibrary();GetProcAddress();

例如:

typedef int (*  LPFNDLLFUNC1)(int,int);

 

 

HINSTANCE hDll;

LPFNDLLFUNC1 myfunc;

hDll = LoadLibrary("perdll.dll");;

myfunc=(LPFNDLLFUNC1)GetProcAddress(hDll,"sum");

printf("%d/n",myfunc(a,b));

FreeLibrary(hDll);

 

 

具体先到这。闪人。。。

 

原创粉丝点击