zoukankan      html  css  js  c++  java
  • 建立WIN32 DLL,并使用静态加载和动态加载

    新建工程,选择win32 dll

    编写.cpp(或.c)

    MyDll.cpp

    #include "windows.h" 
    
    BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
    {
    	return TRUE; 
    } 
    extern "C" _declspec(dllexport)int sum(int a, int b) 
    //extern "C" int sum(int a, int b) 
    {
    	return a+b;
    }

    extern "C"
    (1) 被extern限定的函数或变量是extern类型的
    如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明externint v  被引用的变量v的链接属性必须是外链接(external)的
    (2) 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的
    C和C++编译产生的函数名不同,C为_name,C++为_name_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的
    可以使用__declspec(dllexport)关键字从 DLL 导出数据、函数、类或类成员函数。
    __declspec(dllexport)将导出指令添加到对象文件,若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。
    例如:
    __declspec(dllexport) void __cdecl Function1(void);
    若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
    class __declspec(dllexport) CExampleExport : public CObject
    { ... class definition ... };


    或者使用def文件告诉编译器不要改函数的名字

    可以在这工程里面加一个.h头文件,将要用的函数包含进去,在使用DLL的时候将.h文件拷贝到工程目录下,直接#include进.h,就不用声明函数了。

    静态包含DLL

    建立win32 console app   UseDll

    UseDll.c

    #include <stdio.h>
    #pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入
    int sum(int a, int b);//函数声明,若有.h头文件,加入即可
    int main()
    {
    	k = sum(1, 2);
    	printf("%d 
    ", k);
    	return 0;
    }


    将.dll(动态库)放入运行程序目录里,将.lib(引入库)放入工程目录下


    动态加载DLL

    建立win32 console app   UseDll

    UseDll.c

    #include <stdio.h>
    #pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入
    int sum(int a, int b);//函数声明,若有.h头文件,加入即可
    
    typedef int (*FUN)( );//指向函数的指针FUN,在C中,空为0或多个参数,C++中...为0或多个参数。指针函数在函数参数中可用int (*)()
    FUN   fun;
    HINSTANCE hInstance;
    
    //FARPROC lpFunction;//查看宏可知其为远指针,指向使用_stdcall调用约定(C++默认调用约定,此处加载的DLL为C程序默认使用_cdecl)的函数
    int k;
    
    int main()
    {
    	hInstance = LoadLibrary("MyDll.dll");
    	if(!hInstance)
    		printf("Not Find this Dll 
    ");
    	fun = (FUN)GetProcAddress(hInstance, "sum")
    	if (!fun)
    		printf("not find this fun 
    ");
    	k = fun(1, 2);
    	printf("%d 
    ", k);
    	return 0;
    }


  • 相关阅读:
    sys.stdout.flush-倒计时
    wget 网站扒取
    万能英数脚本
    sample function
    get_time
    读取指定行
    request设置cookies
    resize2fs
    闭包与认识装饰器
    函数的名称空间与作用域
  • 原文地址:https://www.cnblogs.com/yan456jie/p/5369558.html
Copyright © 2011-2022 走看看