跟我一样,很多初学者确实很难编写出如题的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 '=========================================================== 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) '================================================================ a1 = Add(21, 34) Console.WriteLine(a1.ToString) Console.ReadLine() End Sub
9.修改VB.Net项目属性/编译/目标CPU 为x86
10.编译运行成功!
通过这段VB.Net程序的运行结果,我们会发现:调用C++函数的运行效率其实并不如VB.Net同样功能的代码运行效率高,这是为什么呢?