一步一步教用VC和VB调用C++ DLL

合集下载

(原创)VS2019VB如何生成DLL文件,调用DLL

(原创)VS2019VB如何生成DLL文件,调用DLL

(原创)VS2019VB如何⽣成DLL⽂件,调⽤DLL ⼀。

⽣成DLL1.打开VS2019,--->"创建新项⽬"------>"类库(NET Framework)---->下⼀步2. 输⼊项⽬名称:bell,3. 输⼊保存位置:D:\4. 点击右下⽅“创建”5.输⼊如下代码:Public Class LearnDLLFunction ABC()ABC = "你好!我学学怎么建⽴DLL⽂件,并怎么调⽤。

"End FunctionEnd Class5.按F5或启动------> "确定"6.这时,在如下⽂件夹中就⽣成了:D:\BELL\bin\Debug\BELL.dll⼆.调⽤dll⽂件1.在vs2019中新建window窗体应⽤程序2. 输⼊项⽬名称:WindowsApp13. 输⼊保存位置:D:\4. 点击右下⽅“创建”5.在窗体Form1中,添加Textbox1控件:6.项⽬----添加引⽤7. 浏览 D:\BELL\bin\Debug\BELL.dll---->添加8.在BELL.DLL前打对号----->确定9.双击Form1窗体,在代码页输⼊⼀下代码:Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim Goodmood As New BELL.LearnDLLTextBox1.Text = goodmood.ABCEnd SubEnd Class10,编译运⾏。

VB6.0调用C# Dll解决方法

VB6.0调用C# Dll解决方法

VB6.0调用C# Dll解决方法在工作中遇到了在VB6.0的程序里要调用C#的Dll的问题,显然这两个开发环境属于不同的平台。

在网上拜读了几位大师的文章后,在实际试验中还是会发生这样那样的问题,最后还是实现了预期效果,在此我把我的实验步骤和注意事项分享如下,希望对需要之人有所帮助:实验环境:C#dll的创建使用的是VS2010;VB6.0一、C#部分1.用C#创建一个TestVB项目(VS2010);2.所有在VB6中要使用的方法都必须通过继承接口实现,并且为public的(非常重要,没有继承接口实现的方法,在VB6.0里面无法调用);3.接口和类都需要加入属性Guid;Guid通过VS2010自带的工具得到:4.在VS2010的DOS命令工具提示框中运行:sn -k C:\myKey.snk<回车>在C盘根目录下生成一个强名称文件:myKey.snk(注意这个强名称文件的名字可以自己定义,我暂定为myKey.snk)5. 右击项目,选择属性,打开并编辑项目的属性对话框在Application tab中,点击Assembly Information按钮,在打开的对话框中选中“make Assembly COM-Visible”(重要)COM-Visible”(重要)。

在Signing Tab中引入上一步创建的强名称文件myKey.snk不为1.0.*,应该是一个具体的值;7.编译这个项目,生成dll文件。

到此为止,C#的Dll部分已经准备完毕了。

二、VB6部分1. VB6调用环境必须安装.Net framework 4.0或以上版本,最好是4.0(和VS2010相同的framework);2. 复制dll文件进入VB6环境的目标文件夹,例如D:根目录, D:\TestCom.dll3. 在Dos命令窗口用regasm命令注册这个dll文件生成.tlb文件regasm D:\TestCom.dll /tlb:D:\TestCom.tlb /codebase在D:\将会生成一个TestCom.tlb文件4.在Dos命令窗口用gacutil命令添加Dll文件到GAC中(全局程序集缓存),这样这个Dll文件在这个PC中就可以随处使用gacutil /I D:\TestCom.dll5.在VB6项目中,把生成的.tlb文件加入到项目(References)6. VB6代码即可调用tlb文件Private Sub Command1_Click()Dim a As New TestVB.Cryptmand1.Caption = a.Encrypt("aa", "bb")End Sub注意:以上3,4步,需要在VB6环境的C:\WINDOWS\system32下面有相应的exe 文件才可运行;第4步,可以省去;还要说明的是,当转移这个VB6生成的exe程序(这个VB6可执行文件引用了C#的dll)到另外一台电脑上的时候,需要把这个C# Dll文件一同Copy到那台电脑上,并且重新执行第3步的注册生成tlb文件的工作,否则这个exe程序无法运行。

vc的dll基本用法2

vc的dll基本用法2

vc的dll基本用法2==MICROSOFT基础类库:CaptureEncode项目概述===应用程序向导已为您创建了这个CaptureEncode应用程序。

此应用程序不仅演示Microsoft基础类的基本使用方法,还可作为您编写应用程序的起点。

本文件概要介绍组成CaptureEncode应用程序的每个文件的内容。

CaptureEncode.vcproj这是使用应用程序向导生成的VC++项目的主项目文件。

它包含生成该文件的Visual C++的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。

CaptureEncode.h这是应用程序的主要头文件。

它包括其他项目特定的头文件(包括Resource.h),并声明CCaptureEncodeApp应用程序类。

CaptureEncode.cpp这是包含应用程序类CCaptureEncodeApp的主要应用程序源文件。

CaptureEncode.rc这是程序使用的所有Microsoft Windows资源的列表。

它包括RES子目录中存储的图标、位图和光标。

此文件可以直接在Microsoft Visual C++中进行编辑。

项目资源位于2052中。

res\CaptureEncode.ico这是用作应用程序图标的图标文件。

此图标包括在主要资源文件CaptureEncode.rc中。

res\CaptureEncode.rc2此文件包含不在Microsoft Visual C++中进行编辑的资源。

您应该将不可由资源编辑器编辑的所有资源放在此文件中。

///////////////////////////////////////////////////////////////// ////////////应用程序向导创建一个对话框类:CaptureEncodeDlg.h,CaptureEncodeDlg.cpp-对话框这些文件包含CCaptureEncodeDlg类。

vs方案内工程间互相引用dll

vs方案内工程间互相引用dll

vs方案内工程间互相引用dll一、静态链接静态链接是指在编译的时候将DLL的代码直接嵌入到可执行文件中,这样在运行时就不需要再加载DLL。

这种方案的好处是可以避免DLL版本冲突的问题,因为所有需要的函数都已经包含在可执行文件中了。

然而,静态链接的缺点是会导致可执行文件变得很大,而且如果DLL更新了,就需要重新编译可执行文件。

在使用静态链接的情况下,不同工程之间互相引用DLL并不是一个大问题,因为依赖的函数已经包含在可执行文件中了。

只需要在编译的时候将需要的函数链接进来即可。

二、动态链接动态链接是指在运行时才加载DLL,这样可以减小可执行文件的大小,而且可以在不重新编译的情况下更新DLL。

不同的工程之间互相引用DLL在动态链接的情况下,可以使用以下几种方式来解决。

1. 将DLL文件放在同一个目录当不同的工程互相引用同一个DLL时,可以将这个DLL文件放在同一个目录下,这样可以避免编译错误。

但是这种方式可能会导致DLL的冗余,在发布时也不够方便。

2. 将DLL文件复制到系统目录另一种方式是将DLL文件复制到系统目录下,这样不同的工程就可以共享同一个DLL文件了。

但是这种方式可能会造成版本冲突的问题,而且在更新DLL时也不够方便。

3. 使用环境变量使用环境变量来指定DLL的路径是一个比较好的解决方案。

可以将DLL文件放在指定的路径下,然后通过设置环境变量来告诉系统需要加载的DLL文件的路径。

这样不同的工程就可以互相引用同一个DLL了,并且在更新DLL时也比较方便。

四、使用共享库共享库是一种可以被多个程序共享的库,它在程序运行时被加载到内存中。

不同的工程之间互相引用DLL时,可以使用共享库来解决一些常见的问题。

1. 使用动态库在Windows平台上,可以使用.dll文件作为共享库,通过加载动态链接库的方式来实现。

这种方式可以满足不同工程之间互相引用DLL的需求,并且可以有效地解决版本冲突的问题。

2. 使用静态库另一种方式是使用静态库来实现共享库的功能。

MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明

MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明

MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明一、过程概述1、使用VC2010生成.dll文件,测试VC程序是否正常2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。

3、使用MatlabSimulink模型编译成c++文件。

4、VC2010集成MatlabSimulink生成的c++代码,验证在VC2010环境下能正常运行。

5、VC2010将生成的程序编译成.dll文件,以便于VB调用6、使用步骤1,2验证MatlabSimulink生成的代码二、具体实施过程描述1、使用VC2010生成.dll文件1.1工程建立首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入工程名称(MakeDll),选择好保存工程的路径-->确定。

在弹出的“应用程序设置”--> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)" ---->点击"完成"进入项目工作窗口1.2开始创建DLL第一步:在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项---→选择"头文件(.h)" -->输入文件名称(max) --> 点击“添加(A)”,完成max.h文件的添加。

max.h头文件中的代码为:1. #ifndef _MAX_H2. #define _MAX_H_3. __declspec(dllexport) int __stdcall fmax(int a,int b);4. #endif代码说明:__declspec(dllexport) 的作用是指定导出该函数为DLL函数;__stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用;备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。

总结的c#调用DLL方法

总结的c#调用DLL方法
The MaxCD of 456 and 123 is 3
小结:
动态链接具有下列优点:
节省内存和减少交换操作。很多进程可以同时使用一个DLL,在内存中共享该DLL的一个副本。相反,对于每个用静态链接库生成的应用程序,Windows必须在内存中加载库代码的一个副本。
节省磁盘空间。许多应用程序可在磁盘上共享DLL的一个副本。相反,每个用静态链接库生成的应用程序均具有作为单独的副本链接到其可执行图像中的库代码。
long maxcd = MaxCDClass.MaxCD(num1,num2);
Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd);
}
}
若要生成可执行文件MyClient.exe,请使用以下命令行:
csc /out:MyClient.exe /reference:MyLibrary.DLL MyClient.cs
升级到DLL更为容易。DLL中的函数更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。相反,静态链接的对象代码要求在函数更改时重新链接应用程序。
提供售后支持。例如,可修改显示器驱动程序DLL以支持当初交付应用程序时不可用的显示器。
支持多语言程序。只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的DLL函数。程序与DLL函数在下列方面必须是兼容的:函数期望其参数被推送到堆栈上的顺序,是函数还是应用程序负责清理堆栈,以及寄存器中是否传递了任何参数。
}
(3)在CS编辑器中再次添加一个CS文件,名字自取,但包函main入口函数,在这个文件中便可以引用C++写的DLL文件中的函数了

使用vs建立动态链接库dll过程和使用方法

使用vs建立动态链接库dll过程和使用方法

使用vs建立动态链接库dll的过程和使用方法创建动态链接库(DLL)的过程可以分为几个步骤。

我将使用Visual Studio 来演示这个过程:创建DLL的步骤:1.打开Visual Studio,选择“文件”->“新建”->“项目”。

2.在新项目窗口中,选择“Visual C++”->“Windows桌面向导应用程序”。

3.输入项目名称和位置,然后点击“确定”。

4.在“解决方案资源管理器”中,右键单击项目名称->添加->新建项。

5.在“添加新项”窗口中,选择“DLL”,输入DLL名称,然后点击“添加”。

编写DLL代码:现在你已经有了一个空的DLL,你可以开始编写你的代码了。

例如,你可以添加以下代码到你的.cpp文件中:在这个例子中,我们创建了一个简单的函数add,它接收两个整数并返回它们的和。

extern "C"部分告诉编译器使用C链接规则创建导出函数,__declspec(dllexport)部分使得该函数可以从DLL中导出。

编译和生成DLL:在Visual Studio中,你可以通过点击“生成”菜单然后选择“生成解决方案”来编译和生成你的DLL。

如果编译成功,你可以在你的项目文件夹的Debug或Release 文件夹中找到生成的DLL文件。

使用DLL:使用DLL的过程可以分为几个步骤:1.加载DLL:使用Windows API函数LoadLibrary可以加载DLL。

例如:HMODULE hMod = LoadLibrary(TEXT("MyDLL.dll"));。

这个函数会返回一个模块句柄,如果DLL加载成功的话。

2.获取函数地址:使用GetProcAddress函数可以获取DLL中函数的地址。

例如:add_proc = (int (*)(int, int))GetProcAddress(hMod, "add");。

用VB调用VC编写的DLL

用VB调用VC编写的DLL

这些函数名要用做 VB 中声明时的别名。
如果声明时不带别名会出现“Dll 调用约定错误”。
VB 中编写如下代码运行即可:
Option Explicit
Private
Declare
Function
FuncInDll
Lib
"E:\Computer
Science\dll\liudll\dll_withLibAndH.dll" Alias "_FuncInDll@12" (ByVal a As Long,
如何用 VB 调用 VC 编写的 DLL
——DLL 内函数调用采用别名 首先用 C++编写: dll_withlibAndH.h 如下: extern "C" __declspec(dllexport) int __stdcall FuncInDll (int a);
dll_withlibAndH.cpp 如下: #include <objbase.h> #include <iostream.h> #include "dll_withLibAndH.h"//看到没有,这就是我们增加的头文件
创建一个.bat 文件并输入:
Cl/c dll_withLibAndH.cpp
Link/dll dll_withLibAndH.obj 之后运行此批处理文件即生成 dll_withLibAndபைடு நூலகம்.dll 文件。用 Dll 函数查看器(Viewdll
程序)查看此 dll 文件内的函数,此处为_FuncInDll@12(12 为此函数的参数字节数),
ByVal b As Long, ByVal c As Long) As Long

在vb中调用dll的方法

在vb中调用dll的方法

1 制作好DLL之后,就可以用VB调用它,实现VB调用C程序。

VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。

语句格式为:Declare Sub 过程名Lib [ Alias " 别名]([ByVal 参数AS类型]),或为Declare Function函数名Lib [Alias " 别名]([ByVal 参数AS类型])AS类型在声明中首先用Declare 关键字表示声明DLL中的函数。

在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。

有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。

例如上面的ADD.DLL在VB中就可以声明为:Decl are Function ADD Lib “c:\ADD.dll” (ByVal X AS Integer, ByVal Y AS Integer ,ByVal filein asstring)AS Integer通过此声明语句将函数ADD声明到VB中,便可直接调用。

2、dll文件中的函数好像是C语言写的,// 函数名:int __stdcall GetMacNo(int *MacNo)// 功能:获取卡机的卡机号(单机时)// 参数: MacNo[0]-被读出的卡机号// 返回值:0-成功,// 2-PC接收超时,// 3-应答错误dll的文件名是COMM232.dll函数的形参int *MacNo是指针吗?在VB中应该怎么声明和调用该函数?VB里也可以定义指针吗?问题补充:vb调用dll文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事,我是这样声明的对吗?Public Declare Function GetMacNo Lib "COMM232.dll" (ByVal MacNo As Integer) As Integer又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo还是要怎么做?都说了MacNo是被读出的卡机号,那么就是传址的了。

VC++调用C#生成DLL的两种方法

VC++调用C#生成DLL的两种方法

VisualC、delphi或者vb等编程语言来编写的DLL文件,在编译完成以后,产生DLL文件[wen jian]已经是一个可以直接供计算机使用的二进制文件,而Visual c#生成的DLL不是独立运行的程序,是某个程序的一个部分,只能由所属的程序调用,用户不能也不需要打开它,Visual C#编译器生成的托管代码虽然也是二进制文件,但不是可以直接供计算机使用的原始代码,实际上是一种中间语言(IL)代码,需要经过"下一代窗口服务"( Next Generation Windows Services,简写为NGWS ) runtime的即时编译器(即JIT)进行编译。

用Visual C#生成的DLL文件已经和以前的DLL文件有了本质上的区别。

用Visual C#生成的DLL文件在程序设计中更多的表现为一种类(Class)或者类库(Class Library)。

如果想在vc++的非托管代码中调用已经用VC#生成的托管的DLL,从两个方向进行调整可以产生两种办法:(visual studio 2008)(下面方法都是对于同一平台下,即C#跟VC++都是在windows 平台下)一、对VC++的环境中进行修改使其支持托管代码:vc++调用端增加公共语言运行时【clr】的支持以执行C#的程序:【解决方案】 ->【 Properties】(右键)-> 【Configuration Properties】(展开左树) -> 【General】(打开子节点) -> 【Common Language Runtime support】(选中选项) ->【Common Language Runtime support(/clr)】(选中)OK,现在就可以引入托管的动态连接库来用了,不过在调用时还是得注意语法(new->gcnew,....),例如下:#include "stdafx.h"#using "SmartDeviceDLL.dll"using namespace SmartDeviceDLL;int _tmain(int argc, _TCHAR* argv[]){printf("1111111111111\n");SmartDeviceDLL::ICalculator ^pICalc= gcnew SmartDeviceDLL::Class1();long lResult =0;lResult=pICalc->Add(5,10);wprintf(L"the result is %d\n",lResult);printf("222222222222222222\n");char c;scanf("%c",&c);return 0;}二、C#生成DLL端编译成COM接口,供VC++以托管格式调用(命令的运行都是在visual studio command prompt (命令窗口)中)1.新建一个C#的动态连接库(在模板,下单击类库):using System;using System.Linq;using System.Collections.Generic;using System.Text;namespace SmartDeviceDLL{public interface ICalculator{int Add(int Number1, int Number2);}public class Class1: ICalculator{public int Add(int Number1, int Number2){return Number1 * Number2;}public static int TestMethod(String s){Console.WriteLine("Managed assembly: [0]", s);return s.Length;}}}2.为程序集创建一个强命名的类库,并在AssemblyInfo.cs文件中用AssemblyKeyFile属性指向它:1)、使用强命名工具(Strong Name Utility)产生密钥对:sn -k MyKeyFile.snk2)、在AssemblyInfo.cs文件中用AssemblyKeyFile属性指向它:即在项目的文件AssemblyInfo.cs中将[assembly: ComVisible(false)]用以下内容替换:[assembly: ComVisible(true)][assembly: AssemblyDelaySign(false)][assembly: AssemblyKeyFile("MyKeyFile.snk")] //指向刚生成的文件(可用无汉字的绝对路径)3)、重新编译,产生的程序集就是经过签名后的程序集了3.把生成的库文件加入全局程序集缓存(Global Assembly Cache, .NET [Compact]Framework支持一个工具,通常位于:C\Wndows\Assembly下)以便可以从任何COM 客户端激活它,可以使用工具GACUtil.exe,指定/i命令开关将一个程序集安装到GAC中,同样可以使用/u命令开关将一个程序集从GAC中卸载。

VC访问VB的ActiveX.dll

VC访问VB的ActiveX.dll

方法 2 - #IMPORT:
1. 启动 VisualC++6.0 并创建 Win 32 控制台应用程序。 选 择 " An 空项目 " 并单击完成。 2. 指向项目菜单上, 单击新建将新 C++ 源文件添加到项目 上添加到项目。 将以下代码粘贴到新源文件并保存: #include <stdio.h> // This is the path for your DLL. // Make sure that you specify the exact path. #import "c:\project1.dll" no_namespace void main()
如何从 VisualC++6.0 可执行文件访问 VisualBasicActiveXDLL 本文介绍三种方法可以从 VisualC++6.0 访 VisualBasicActiveXDLL 执行。 1.创建 VisualBasicActiveXDLL 项目。 默认情况下创建 Class 1。 2.以下代码添加到 Class 1: Public Function MyVBFunction(x As Integer) As Integer MsgBox x End Function 3.编译 DLL 作为 c:\Project1.dll 并退出 Visualpatch:
1.启动 VisualC++ 并在文件菜单上选择新建。 选择 MFC 应 用程序向导 (Exe) 和项目名称和 Click 确定。 出现 MFC 应用程序 向导对话框, 时单击完成。 在下一个对话框中单击确定。 2.在视图菜单上选择 ClassWizard, 在类名称框中, 选择 Ctst1App 并双击 InitInstance 消息中。 单击编辑代码以对于 BOOL CTst1App::InitInstance() 调出代码、 查找行 AfxEnableControlContainer();,: 并添加以下行之前 AfxOleInit(); 3.从视图菜单中选择 ClassWizard 单击 Click AddClass 自 动化选项卡并选择 " 从 TypeLibrary "。 指定 Project 1 .dll, VisualBasic DLL 是步骤 3 中创建它。 当出现确认类对话框, 单击 确定。 单击确定以关闭 MFCClassWizard 对话框中再次。 4.打开 App 名 > .cpp 文件并添加行 # include " Project1.h "。 您需要包括 Project1.h 只要您有访问 project1.dll 代码。 5.再次打开 ClassWizard。 在消息映射选项卡, 选择 @ @ ClassName@@ @ 框和对象 ID 中, IDOK 中 CAboutDlg, 然后双击 BN _ CLICKED。 以响应对话框并确定以关闭 ClassWizard 再次单击 确定。

(完整版)vb调用vc的DLL

(完整版)vb调用vc的DLL

4.1 新建工程打开在VC++6.0,new 一个Win32-Dynamic-Link Library 工程dlltest4.2 在工程中添加代码4.2.1 添加lib.h 文件:#ifndef _LIB_H_ #define _LIB_H_ extern “ C” int__stdcall add(int,int) ;extern “ C” int __stdcall sub(int,int) ;/*__stdcall 约定如果通过VC++ 编写的DLL 欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall 方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。

__stdcall 方式与__cdecl 对函数名最终生成符号的方式不同*/ #endif4.2.2 添加lib.cpp 文件:#include “ lib.h ”int __stdcall add(int a,int b) {return a+b ;}int __stdcall sub(int a,int b) {return a-b ;}4.2.3 添加lib.def 文件:右击SOURCE FIL E录,添加一个文本文件(不能是word文档,一般是txt 格式的),将文档重命名为lib.def ,点击打开该文档。

在文档中输入代码:LILBRARY dlltestEXPORTSadd @ 1sub @ 2说明:DLL函数的导出有两种方式。

一种是显式导出:在.h 文件中在函数声明前加入如下语句:__declspec(dllexport) 。

使用该方法是不用添加.def 文档的。

该方法导出的函数,只能被C或C++调用,不能被其他语言调用。

一种是隐式导出:就是在SOURCE FIL目录中添加一个.def文档,在该文档中写入要导出函数的代码。

.def 语法规定注释用分号(;), 且注释不能与代码共享一行,代码说明如下:LIBRARY dlltest;该语句说明了相应的DLL工程。

C++Builder和VisualC++之间互相用dll的方法

C++Builder和VisualC++之间互相用dll的方法

C++Builder和VisualC++之间互相用dll的方法在 C++Builder 工程里使用 Visual C++ DLL——第1部分:C函数译者序:第一次读这篇文章是在 2001 年 10 月,帮我解决了一点小问题。

本来不好意思翻译,因为英语水平实在太差。

最近发现不少网友在问在C++Builder 的工程里调用Visual C++ DLL 的问题,也许是用C++Builder 的人比以前多了吧。

于是把心一横,不就是板儿砖嘛?“抛砖引玉”,希望它能给你帮点小忙,也欢迎指出翻译中的错误。

source:很可能有一天你的老板问你是否能用C++Builder 创建一个GUI,调用现有的用 Microsoft Visual C++ 编译的 32 位 DLL。

经常地,原始 DLL 的源代码不会提供给你,也许因为 DLL 来自第三方供应商,也可能是 22 岁的实习生不小心从网络上删除了 \DLL\SRC 目录。

给你一个 DLL 和头文件,这篇文章为你示范如何在你的 C++Builder 工程里调用这种 DLL。

* 在 C++Builder 工程里调用 DLL 函数* Visual C++ DLL 带来的问题* 第1步:识别在 Visual C++ DLL 里使用的调用习惯* 第2步:检查 DLL 里的连接名字* 第3步:为 Visual C++ DLL 生成引入库* 第4步:把引入库添加到你的工程里* 结束语在 C++Builder 工程里调用 DLL 函数调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战。

在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个C++Builder 创建的DLL 可能会有所帮助。

调用C++Builder 创建的 DLL 要比 Visual C++ 的少了许多障碍。

为了在你的 C++Builder 工程里调用 DLL,你需要三种元素:DLL 本身,带有函数原型的头文件,和引入库(你可以在运行时载入DLL,而不是使用引入库,但为了简单我们按引入库的方法做)。

在VB中调用DLL的方法

在VB中调用DLL的方法

在VB中调用DLL的方法方法一:使用Declare语句VB中可以使用Declare语句来声明DLL函数,然后直接调用该函数,具体步骤如下:1.确保DLL文件已经存在,并了解所要调用的DLL函数的名称、参数和返回值类型。

2. 在VB代码的模块级别上,使用Declare语句来声明DLL函数,语法如下:Declare Function functionName Lib "dllFileName" ([参数列表]) As 返回值类型其中,functionName是要调用的DLL函数的名称,dllFileName是DLL文件的名称(带有扩展名),[参数列表]是DLL函数的参数列表,如果没有参数,则可以省略;返回值类型是DLL函数的返回值类型。

3. 在需要调用DLL函数的地方,直接使用函数名进行调用,如:result = functionName([参数])其中,result是接收DLL函数返回值的变量。

4.运行程序,并检查结果是否正确。

方法二:使用COM组件如果DLL文件是使用COM组件进行编写的,可以使用VB的COM互操作性来调用DLL方法,具体步骤如下:1.确保DLL文件已经注册为COM组件,并了解所要调用的DLL方法的名称、参数和返回值类型。

2.在VB项目中添加对DLL文件的引用,方法是在“项目”->“引用”菜单下,选择“添加引用”,然后在“COM”选项卡中找到并选中DLL文件。

3. 创建一个COM对象,可以使用CreateObject或者New关键字,具体语法如下:Dim obj As ObjectSet obj = CreateObject("dllFileName.ClassName")'或者Dim obj As New dllFileName.ClassName其中,dllFileName是DLL文件的名称(不带扩展名),ClassName是DLL内部的类名。

如何用VB编写自己的DLL文件,并调用其中的函数

如何用VB编写自己的DLL文件,并调用其中的函数

如何用VB编写自己的DLL文件,并调用其中的函数一、VB编写自己的DLL文件1.新建一个VB工程,工程类型为ActiveX DLL类型。

2.设定工程的名字和类模块的名字。

这里我使用的工程的名字是DLLTest,类模块的名字是Class1。

3.在类模块中写入要封装的函数这里我写了一个计算长方体的体积的函数,代码如下:1.Function calVolume(ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double2.calVolume = a * b * c3.End Function4.保存工程,并生成Dll文件。

通过选择”文件“->”生成DllT est.dll“,生成Dll文件。

至此,完成Dll文件的制作。

二、如何调用自己制作的Dll文件中的函数1.新建一个VB工程,工程类型为标准EXE类型。

2.注册制作的Dll文件。

注册命令格式为:regsvr32 dll文件的绝对地址名称举例说明:比如我把上面我生成的DllTest.dll放在了E盘的VbTest文件里面了,那么我的注册命令为:regsvr32 E:\VbTest\DllTest.dll。

如果注册成功,系统会有弹窗提示。

(测试发现,注册dll文件时,路径文件夹的名字不能有空格)3.在工程中添加相关引用。

”工程“->”引用“->”DllTest“,在DllTest前面打上对勾,即可。

4.编写调用Dll文件的相关代码。

这里我在主窗体中添加了一个按钮,在按钮里面写入了如下代码:Private Sub Command1_Click()Dim MyObj As DllT est.Class1 Set MyObj = New Class1Dim aa As DoubleDim bb As DoubleDi m cc As DoubleDim tempVolume As Doubleaa = 1.1bb = 2.2cc = 3.3tempVolume = MyObj.calVolume(aa, bb, cc)MsgBox temp VolumeEnd Sub另外,我添加了一个模块,在模块中写入了如下代码:Public Declare Function calVolume Lib 'DllTest.dll' (ByVal a As Double, ByVal b As Double, ByVal c As Double) As Double5.至此结束。

如何使用LabVIEW调用C#编写的DLL

如何使用LabVIEW调用C#编写的DLL

如何使用LabVIEW调用C#编写的DLL如何使用LabVIEW调用c#编写的DLL最近在做一个项目时,需要在Labview中列出可用的磁盘驱动器,我们可以使用互连接口》库与可执行程序》执行系统命令vi,但是在程序运行时会弹出命令提示符窗口,对于计算机菜鸟用户而言,他们或许会以为那是在执行病毒程序,为了增加用户的好感度,本文采用调用DLL的方式来解决问题。

在调用DLL之前,我们先来创建一个DLL,打开VS2008,新建一个类库项目,如下图:点击确定后进入代码编写窗口。

编写好的代码如下图所示:选择VS2008的生成》配置管理器,打开配置管理器,如下图所示:在活动解决方案配置下拉框中选择Release,然后点击关闭。

选择生成》生成DrivesInfoDll,然后生成一个DLL文件。

在项目的的bin\Release目录下面可以找到生成的DLL文件,如下图所示:我们把它复制我要使用它的地方,如下图:现在,打开LabVIEW2012,新建一个VI,切换到程序框图,选择下图的构造器节点到程序框图:此时将自动打开选择.NET构造器:点击浏览按钮,选择要调用的DLL:点击确定后在对象中选择Class1:,如下图所示:点击确定按钮关闭对话框。

选择下图的调用节点到程序框图:将构造器节点的“新引用”输出端与调用节点的“引用”输入端连接起来,然后在调用节点的“方法”上点击,选择我们要使用的方法,这里选择GetDrivesInfo()。

选择下图的关闭引用到程序框图并连接调用节点的“引用输出”输出端到关闭引用的“引用”输入端。

然后创建一个字符串数组,显示GetDrivesInfo方法的执行结果。

完整的程序框图如下:运行后的前面板结果如下:这说明程序是执行成功了的。

Visual Studio DLL的封装和调用教程

Visual Studio DLL的封装和调用教程

Visual Studio DLL的封装和调用教程1.新建一个C#类库项目。

2.输入自己想要的代码。

(本教程以一个物理公式为例。

)using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Grade8Physics{public static class Class1{public static double speedv(double s, double t){if (t > 0){return s / t;}else{return 0;}}}}3.生成解决方案。

4.打开生成目录,复制DLL。

5.粘贴到要调用它的项目目录中。

6.打开这个项目。

7.添加引用,引用刚才的DLL。

8.打开对象浏览器,就能看到刚才DLL中的对象,它可以在任何编程语言之间通用,所以你编写时可以根据自己的爱好选择与此示例不同的编程语言。

8.在代码中调用,实现其功能。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Label4.Text = Grade8Physics.Class1.speedv(Val(TextBox1.Text), Val(TextBox2.Text)) End Sub9.运行结果。

vc调用动态库dll和lib

vc调用动态库dll和lib
extern"C"void_cdeclcdeclproc(void);
extern"C"void_fastcallfastcallproc(void);
//noname.cpp动态链接库实现文件
#include<windows.h>
extern"C"void_stdcallstdcallproc(void)
(1)静态链接到MFC 的规则DLL
静态链接到MFC的规则DLL与MFC库(包括MFC扩展 DLL)静态链接,将MFC库的代码直接生成在.dll文件中。在调用这种DLL的接口时,MFC使用DLL的资源。因此,在静态链接到MFC 的规则DLL中不需要进行模块状态的切换。
使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
if(youFuntionNameAlias)
{
youFuntionNameAlias(param1,param2);
}
FreeLibrary(hDllInst);
}
}
显式(静态)调用:
LIB + DLL + .H,注意.H中dllexport改为dllimport
#pragma comment(lib,"RegularDll.lib")
3.3共享MFC DLL的规则DLL的模块切换
应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x10000000。如果程序同时加载了多个DLL,则每个DLL模块都会有不同的 HINSTANCE。应用程序在加载DLL时对其进行了重定位。

VB调用C#封装dll文件

VB调用C#封装dll文件

第一步C# 封装dll文件1、创建TestVotedll工程,设置工程属性如下图2、编写程序using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;//提供各种各样支持 COM 互操作及平台调用服务的成员namespace TestVoteDll{//定义接口public interface ITestClass{void SetCom(string comid);//bool InitVote(string [,] voteinfo);string[,] GetVoteResult();}[ClassInterface(ClassInterfaceType.None)]//必须增加的一句话。

public class VoteCom : ITestClass //通过接口继承父类ITestClass{public string[,] myvoteInfo;public int lng1 = 0;public int lng2 =0;public string ComID = "COM1";public void SetCom(string comid){}public Boolean InitVote(string[,] voteinfo){lng1 = voteinfo.GetLength(0);lng2 = voteinfo.GetLength(1);myvoteInfo = new string[lng1, lng2];for (int k = 0; k < lng1; k++){for (int m = 0; m < lng2; m++){myvoteInfo[k, m] = voteinfo[k, m];}}return true;}public string [,] GetVoteResult(){int k = 1;for (int m = 0; m < lng2; m++){myvoteInfo[k, m] =System.Environment.TickCount.ToString();}return myvoteInfo;}}}编译生成时,查看Debug目录下有两个文件TestV oteDll.dll和TestV oteDll.tlb 3、建立VB工程引用TestVoteDll.tlb此文件,编写测试程序Dim a As ObjectSet a = CreateObject("TestV oteDll.Class1")Dim c() As StringReDim c(1, 1) As Stringc(0, 0) = 1c(0, 1) = 2c(1, 0) = ""c(1, 1) = ""Dim Res As BooleanRes = a.InitVote(c) //传入数组Call a.SetCom("COM2") 可以传入字符串Dim b() As Stringb = a.GetVoteResult() //获取dll文件的数组。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一步一步教你用VC和VB调用C++ DLL从VC++应用程序调用C++ DLL的函数Visual Studio 6 使创建包含函数或类的动态连接库(DLL) 变得非常容易.第一步打开Visual Studio 然后选择File | New菜单项:选择Win32 Dynamic Link Library, 输入工程名, 敲OK.选择A DLL that exports some symbols 并单击Finish.在File View里你会看到如下的工程文件:第二步在Test.cpp里,你将看到如下代码:// Test.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "Test.h"BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_ call,LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}// This is an example of an exported variableTEST_API int nTest=0;// This is an example of an exported function.TEST_API int fnTest(void){return 42;}// This is the constructor of a class that has been exported.// see Test.h for the class definitionCTest::CTest(){return;}Test.cpp 包含了fnTest 和 CTest::CTest.如果你现在编译Test.dll, 你将会得到一个可以被其他VC++应用程序直接调用的DLL. 允许其他VC++程序调用的关键机制?( key mechanism)就包含在Test.h中:// The following ifdef block is the standard way of creating macros// which make exporting from a DLL simpler. All files within this DLL// are compiled with the TEST_EXPORTS symbol defined on the command line.// This symbol should not be defined on any project that uses this DLL.// This way any other project whose source files include this file see // TEST_APIfunctions as being imported from a DLL, whereas this DLL// sees symbols defined with this macro as being exported.#ifdef TEST_EXPORTS#define TEST_API __declspec(dllexport)#else#define TEST_API__declspec(dllimport)#endif// This class is exported from the Test.dll 共4页第1页第2页第3页第4页class TEST_API CTest{public:CTest(void);// TODO: add your methods here.};extern TEST_API int nTest;TEST_API int fnTest(void);这里面发生了什么? #ifdef TEST_EXPORTS是什么意思? TEST_EXPORTS又是在哪定义的?TEST_EXPORTS如果被定义, 那么TEST_API将会被定义为__declspec(dllexport) (DLL导出),否则,将会被定义为__declspec(dllimport)(DLL导入). 这将影响到后边定义的Ctest类是导出类还是导入类. 这意味着如果我们需要导出的时候,我们就得定义TEST_EXPORTS.当一个V C++应用程序要访问这个DLL的时候,可以将Test.lib链接进去,它包含了DLL的导出符号.第三步TEST_EXPORTS在哪里被定义了呢? DLL wizard干了一件我讨厌的事,它把TEST_EXPORTS 放到了命令行里. 选择Project | Settings | C/C++ | General,你将看到工程选项:当然了,这个办法是可行的. 但是它却容易让人忽计,并且可能导致维护上的麻烦. 我比较喜欢清楚明白的定义TEST_EXPORTS : 从项目选项里边去掉/D "TEST_EXPORTS",然后在Test.cpp里来定义它:// Test.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#define TEST_EXPORTS // <=== ADD THIS LINE#include "Test.h"BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){...注意#define TEST_EXPORTS在#include "Test.h"前边. 所以,它定义要在头文件里.现在,可以像先前那样重新编译我们的Test.dll, 我们将得到一个可以被其他VC应用程序所调用的DLL.第四步我们如何调用DLL里的函数呢? 举个例子吧, 我用VS创建一个示例. 选MFC AppWizard (exe),输入项目名字,然后点OK. 选择基于对话框. 然后点Finish. 打开XXXDlg.cpp(XXX是你的工程名字.) 找到OnInitDialog()成员函数, 敲进去如下的代码:...// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// code to test Test.dll function:int n = fnTest(); // <=== ADD THIS LINE// code to test the CTest class:CTesttest;// <=== ADD THIS LINEreturn TRUE; // return TRUE unless you set the focus to a control}第五步我们还没写完代码呢, 现在要把Test.h这个DLL的头文件包含进去:// TestExeDlg.cpp : implementation file//#include "stdafx.h"#include "TestExe.h"#include "TestExeDlg.h"#include"Test.h" // <=== ADD THIS LINE...第六步如果你想赶时间做一个演示的话, 你可能会尝试只是拷贝DLL的test.h 到你的项目目录里去,那么编译器会找到它. 但是当项目很大的时候,这可不是个好主意, 因为当你更新你的DLL文件时,可能会遇上危险.比如忘了拷贝它到你的exe的目录中去. 这里有个简单的方法来解决这个问题: 选择Project | Settings | C/C++ | Settings | Preprocessor, 并且添加Additional include directories: (DLL工程的目录)提示这样做实际上是假设DLL项目和EXE项目拥有同一个项目目录.现在当我编译的时候, 我得到了一个linker errors!!Deleting intermediate files and output files for project 'TestExe - Win32 Debug'.--------------------Configuration: TestExe - Win32 Debug--------------------Compiling resources...Compiling...StdAfx.cppCompiling...TestExe.cppTestExeDlg.cppGenerating Code...Linking...TestExeDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall CTest::CTest(void)" (__imp_??0CTest@@QAE@XZ)TestExeDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport)int __cdecl fnTest(void)" (__imp_?fnTest@@YAHXZ)Debug/TestExe.exe : fatal error LNK1120: 2 unresolved externalsError executing link.exe.TestExe.exe - 3 error(s), 0 warning(s)第七步虽然我已经告诉编译器DLL符号啦,但是链接器还不知道. 所以我们必须告诉链接器.. 选择Project | Settings | Link,把DLL的lib文件加到Object/library modules里边去:----------------------------------------------第八步好啦,现在编译通过. 在我们运行程序前,别忘了一件事: 把Test.dll拷贝到EXE的目录里去.第九步接下来,可以放一个断点到OnInitDialog()函数里去, 点GO(F5)调试运行:可以看到, fnTest返回了42, 和我们预测的一样. CTest类也可以用类似的方法来测试.要点.∙VS的工程向导为我们创建VC++DLL提供了很好的开始.∙函数,类, 和变量可以从DLL中导出.∙使用#define预处理器定义, 一个头文件将可以被DLL 和应用程序共同使用.∙DLL导出它的符号,并且应用程序导入这个DLL符号. 当编译应用程序时,编译器通过头文件看到的DLL符号, 当链接应用程序时, 链接器通过导入库(Test.lib)看到DLL符号.∙当执行应用程序时,DLL必须放到和EXE相同的目录中去. DLL也可以放到windows或者system目录中,这样也是可行的, 但是它经常引起某些问题, 所以应该避免这样使用和exe文件. 如果这样做的话,我们怎么告诉链接器找到lib文件呢? 有两种方法来做:1. 选择Tools | Options | Directories and set Show directories for为"Library files". 在下边添加上我们工程所使用的Lib文件的路径.1. 2. 另一种办法是,选择Project | Settings | Link, 选category为Input ,在下边的Additional library path 筐里输入工程使用的lib文件的所在路径.哪种方法更好一点呢?这取决于你的开发环境. 第一种方法要求整个工程要共享的设置目录路径, 并且所有要求所有的开发者的VS都必须设置到这些路径.第二种方法允许每个工程定制自己的路径,并且在工程中被储存,如果开发者的计算机上存放了同样的目录,那么每个开发者都可以签出工程并且设计. ,这样可以避免在每台机器上都去设置同样的路径.到现在,我还没有说怎样指定要使用的LIB文件, 我的办法是在DLL的Test.h中添加两行,现在它看起来像下边的样子:#ifdef TEST_EXPORTS #define TEST_API__declspec(dllexport)#else #define TEST_API__declspec(dllimport) #pragma message("automatic link to Test.lib") // <== add this line #pragma comment(lib, "Test.lib") // <== add this line#endif// This class is exported from the Test.dllclass TEST_API CTest{public:CTest(void);};extern TEST_API int nTest;TEST_API int fnTest(void);这样做,保证了当工程包含DLL的头文件时, 它会自动的把DLL 的lib链接进去,我们可以从VS的OUTPUT窗口看到#pragma message给我们的传达的"automatic link to Test.lib"这个消息.(PS:原文在这里/dll/XDllPt1.aspdemo也可以在这里下载到)。

相关文档
最新文档