跟我一樣,很多初學者確實很難編寫出如題的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同樣功能的代碼運行效率高,這是為什么呢?
