VS2015写的一个DLL 与C语言调用

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

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页