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

    技术2022-05-11  18

    简单先讲下建立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);

     

     

    具体先到这。闪人。。。

     


    最新回复(0)