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中我們發現我們的程序能夠調用了

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章