Visual C++ 編寫供 VB.Net調用的DLL


跟我一樣,很多初學者確實很難編寫出如題的DLL,即使編寫出來也經常在調用過程中出現各種問題。我根據摸索寫出了一個DLL,編譯和調用代碼獲得通過。

以下舉例簡單說明,具體還有很多問題我也待繼續研究。

 

1.用Visual C++ 新建一個Win32控制台 DLL項目(記得打鈎空項目) 如:MyDll1

2.在頭文件添加 Mydll1.h

#pragma once 
#include <iostream>
//函數原型
int __stdcall Add(int a, int b);
void __stdcall  ShuChu();

3.在源文件添加 Mydll1.cpp

#include "MyDLL1.h"

using namespace std;

int __stdcall Add(int a, int b)
{
    return a + b;
}

void __stdcall  ShuChu()
{
    unsigned long i = 1;
    unsigned long ulNum = 50000;  //循環5萬次
    
    while (ulNum != 0)
    {
        cout <<"The ulNum is: "<< i <<endl ;
        ulNum--;
        i++;
    }
}

4.在項目菜單下修改 Mydll1 屬性的配置如下(注意黑體粗體字部分):

5.先把項目編譯一遍,得到一個Mydll1.map文件,在這個文件里包括該dll文件成員函數的名字修飾

因為做為初學者甚至是資深專家,都很難搞清楚成員函數名字修飾的規則,所以你必須要靠編譯器本身來弄清楚修飾名。

6.編輯MyDll1.def文件為如下內容:

LIBRARY
EXPORTS
   Add = ?Add@@YGHHH@Z 
   ShuChu = ?ShuChu@@YGXXZ    

7.再次編譯該項目一次。

這樣就完成了一個可供VB.Net調用的Mydll1.DLL文件,把該文件拷貝進你要調用的VB.Net項目下的 \bin\Debug 文件夾下

8. VB.Net控制台項目的代碼如下(具體功用不再詳述):

 Private Declare Function Add Lib "MyDll1.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
 Private Declare Sub ShuChu Lib "MyDll1.dll" ()

    Sub Main()

        Dim a1 As Integer
        Dim S1 As DateTime, S2 As DateTime
        Dim T1 As TimeSpan, T2 As TimeSpan

        Dim i As Long = 1
        Dim ulNum As Long = 50000
        '============= 調用並計算函數運行時間 ===========================
        S1 = Now
        ShuChu()
        S2 = Now
        T1 = S2.Subtract(S1).Duration

        '============= 用VB實現以上調用函數的相同功能 ====================
        S1 = Now
        While (ulNum <> 0)

            Console.WriteLine("The ulNum is:" & Str(i))
            ulNum -= 1
            i += 1

        End While
        S2 = Now
        T2 = S2.Subtract(S1).Duration

        Console.WriteLine(T1.TotalSeconds.ToString)
        Console.WriteLine(T2.TotalSeconds.ToString)
        '============== 調用DLL 里的Add函數===========================
        a1 = Add(21, 34)
        Console.WriteLine(a1.ToString)

        Console.ReadLine()

    End Sub


9.修改VB.Net項目屬性/編譯/目標CPU 為x86

10.編譯運行成功! 

 通過這段VB.Net程序的運行結果,我們會發現:調用C++函數的運行效率其實並不如VB.Net同樣功能的代碼運行效率高,這是為什么呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM