突然想起好久沒有折騰下dll了,之前在win7VS2010 練習了一個最基本的dll調用。
首先新建一個 dll工程,這裏我們新建的是win32下面的dll
而不是通用DLL 這個 貌似是win10用的,抱歉我對這個類型的研究的不深,反正我新建之後反覆加載不到這個dll
dll代碼很簡單
int num_add(int a, int b)
{
return (a + b);
}
這裏有很多種導出方法,我使用的是模塊定義文件.def 記得VC6.0時候這個文件還要手動創建,現在好了,直接在項目下右鍵添加然後我們發現鏈接器自動識別了
我們可以使用VS2015開發者命令行工具,這個環境有dumpbin /EXPORTS 查看一下導出的函數
可以發現 這個函數能夠導出
然後我們建立測試程序
// test.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
#define NOMOUDLE 126
typedef int(*lpAddFun)(int, int);//定義一個與Add_new函數接受參數類型和返回值均相同的函數指針類型
int main()
{
HMODULE hDll;//句柄
lpAddFun addFun;//函數指針
TCHAR szPath[MAX_PATH];
GetModuleFileName(NULL, szPath, MAX_PATH);
hDll = LoadLibrary(_T("Win32Project2.dll"));//動態加載DLL模塊句柄
DWORD errCode=GetLastError();
char szError[] = { "未找到模塊 \n" };
if (hDll)
{
addFun = (lpAddFun)GetProcAddress(hDll, "num_add");//得到所加載DLL模塊中函數的地址
if (addFun)
{
int result = addFun(2, 3);
printf("%d", result);
}
FreeLibrary(hDll);//釋放已經加載的DLL模塊
}
else if(NOMOUDLE ==errCode) //GetLastError錯誤碼126代表沒有找到制定模塊
{
printf("%s", szError);
}
Sleep(1000);
return 0;;
}
只要dll和我們的測試exe在同一個解決方案 就能夠識別。測試結果
Python調用dll
from ctypes import *
handle=cdll.LoadLibrary("Win32Project2.dll")
result=handle.num_add(10, 30) # 調用 add 函數
print (result)
注意我們這裏編譯的是32位dll 如果直接這樣調用會報錯
self._handle = _dlopen(self._name, mode) OSError: [WinError 193] %1 不是有效的32位……
這裏我們需要編譯成64位
在vs中 這樣很簡單
然後把x64位拷貝到Pycharm中我們發現我們的程序能夠調用了