zoukankan      html  css  js  c++  java
  • DLL简单示例

    DLL调用方式:

    1. 静态调用(编译时链接DLL)
    2. 动态调用(运行时显示调用)

    代码如下:

    • DLL
      • DLL的编译将生成DLLLIB两个文档(TestDLL.dll、TestDLL.lib)。
      • LIB文档是在编译时用来链接DLL的,称为引用链接库
    #include <windows.h>
    
    // Export this function
    extern "C" __declspec(dllexport) double AddNumbers(double a, double b);
    
    // DLL initialization function
    BOOL APIENTRY
    DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
    {
    	return TRUE;
    }
    
    // Function that adds two numbers
    double
    AddNumbers(double a, double b)
    {
    	return a + b;
    }
    • 静态调用
      • TestDLL.lib拷至编译目录下
      • TestDLL.dll拷至exe目录下
    #include <windows.h>
    #include <stdio.h>
    #pragma comment(lib,"TestDLL.lib") //链接引用链接库
    
    // Import function that adds two numbers
    extern "C" __declspec(dllimport)double AddNumbers(double a, double b);
    
    int
    main(int argc, char **argv)
    {
    	double result = AddNumbers(1, 2);
    	printf("The result was: %f\n", result);
    
    	system("pause");
    	return 0;
    }
    • 动态调用
      • TestDLL.dll拷至exe目录下
      • 无需TestDLL.lib
    #include <windows.h>
    #include <stdio.h>
    
    // DLL function signature
    typedef double (*importFunction)(double, double);
    
    int
    main(int argc, char **argv)
    {
    	importFunction addNumbers;
    	double result;
    
    	// Load DLL file
    	HINSTANCE hinstLib = LoadLibrary(L"TestDLL.dll");
    	if (hinstLib == NULL) {
    		printf("ERROR: unable to load DLL\n");
    		return 1;
    	}
    
    	// Get function pointer
    	addNumbers = (importFunction)GetProcAddress(hinstLib, "AddNumbers");
    	if (addNumbers == NULL) {
    		printf("ERROR: unable to find DLL function\n");
    		return 1;
    	}
    
    	// Call function.
    	result = addNumbers(1, 2);
    
    	// Unload DLL file
    	FreeLibrary(hinstLib);
    
    	// Display result
    	printf("The result was: %f\n", result);
    
    	system("pause");
    	return 0;
    }
    • 动态调用失败原因:
      1. 调用约定不匹
      2. 导出函数名被修改(可通过Depends.Exe查看导出函数名)
      3. 相应LIB或DLL未拷至相应目录下
  • 相关阅读:
    在C#中使用消息队列RabbitMQ
    从url到页面经历了什么
    jsonp跨域远离
    DNS预处理
    一个架构师需要考虑的问题
    angular2和Vue2对比
    图片多的问题
    xinwenti
    xss和csrf
    ajax是什么
  • 原文地址:https://www.cnblogs.com/dahai/p/2080693.html
Copyright © 2011-2022 走看看