突然想起好久没有折腾下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中我们发现我们的程序能够调用了