一步一步教用VC和VB调用C++ 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的问题,显然这两个开发环境属于不同的平台。
在网上拜读了几位大师的文章后,在实际试验中还是会发生这样那样的问题,最后还是实现了预期效果,在此我把我的实验步骤和注意事项分享如下,希望对需要之人有所帮助:实验环境: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==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一、静态链接静态链接是指在编译的时候将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调用使用说明一、过程概述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方法

小结:
动态链接具有下列优点:
节省内存和减少交换操作。很多进程可以同时使用一个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的过程和使用方法创建动态链接库(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 中声明时的别名。
如果声明时不带别名会出现“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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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也可以在这里下载到)。