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未拷至相应目录下
  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/dahai/p/2080693.html
Copyright © 2011-2022 走看看