vb调用vc动态连接库总结
VC++ 2017 动态链接库的创建和使用总结
Visual studio c++ 2017 动态链接库的创建和使用总结一动态链接库的创建两种方式:1、只有从文件->新建->项目->Windows桌面-> Windows桌面向导->选择“动态链接库(.dll)->生成解决方案,才会生成.dll和.lib文件。
(1)在头文件声明中(注意要在头文件变量和函数声明中,而不是在变量和函数的定义中声明),不加extern “C”修饰,编译成DLL后,用depends.exe查看导出函数名。
可以看出,导出的函数名都被编译器篡改了。
(2)在头文件声明中,变量和函数名前加extern “C”修饰后,编译成DLL后,再用depends.exe查看导出函数名。
可以看出,用extern “C”修饰的函数名,编译后函数名保持不变。
类及成员函数不能用extern “C”修饰,编译成DLL后,成员函数名发生了改变。
2、如果从文件->新建->项目->动态链接库(DLL)->生成解决方案,就只生成.dll,不生成.lib。
二动态链接库的调用两种方式:1、显式调用(1)使用显式调用的前提:创建的DLL,编译时不要篡改函数名称,定义函数名时,可用extern “C”修饰函数名,保证编译时,函数名不被篡改。
否则GetProcAddress( )不能正确地获取dll中的函数名。
但是导出的类不能使用extern “C”修饰。
(2)使用显式调用的优点:不用动态链接库的.h和.lib文件,只要有.dll文件就可调用库函数,使用LoadLibrary(),在需要调用.dll中的库函数时,才动态加载到内存中,使用完毕后,可以用FreeLibrary()释放内存中的dll;使用GetProcAddress( )获取dll中的函数名。
必须事先知道dll中的函数名和形式参数。
(3)使用显式调用缺点:调用每个函数时,都必须使用 GetProcAddress( )获取dll中的函数名,并转换成原来的函数,比较麻烦。
VB调用C程序的方法
VB调用C程序的方法—动态链接库法文中介绍了一种实现VB调用C语言程序的方法-动态连接库法,给出了动态链接库制作的一般框架,通过实例描述了动态连接库的实现及其制做方法、编程步骤,这种方法具有普遍的意义。
关键词VB 动态连接库DLL C程序一、引言Visual Basic( 以下简称VB)是一种可视化的面向对象的编程语言,以其编程简单、快捷等特点,深受广大WINDOWS程序员的青睐。
利用VB开发界面友好、操作方便的软件只需很短的时间。
但是VB运行速度较慢,对于庞大的科学计算问题,VB的这种慢速会使人难以忍受。
C语言是国际上非常流行的一种中级编程语言,以其灵活、高效等优点而获得广泛应用,许多的应用程序都是用C语言在DOS环境下编写而成。
那么如何发挥VB和C这两种语言的优势,用VB设计一种良好的for windows界面来调用C语言程序,即实现VB调用C 语言程序呢?现有的文献只提到动态链接库(以下简称DLL)可以将这两种语言连接起来,但有讲动态链接库DLL的制做及其编程方法。
本文详细介绍了Borland C环境下制作动态链接库以及VB调用for dos动态链接库的的方法、步骤,并通过实例描述VB调用C程序的全过程。
二、用Borland C编写DLL程序的方法要想实现VB调用C程序,首先需要用Borland C编写动态连接库DLL程序(假设DLL程序取名为example)。
动态链接库包含四个文件:C语言源程序(.C)、模块定义文件(.DEF)、原型函数文件(.H)和工程文件(.PRJ)。
下面分别详细介绍一下这四种文件的具体结构。
1、编写C语言源程序的框架:C语言源程序(example.C),它包括三种函数:入口函数、输出函数和终止函数。
其具体结构如下:/*************************************//* 文件名:example.C *//*************************************/#include <windows.h>/***********入口函数***********/int FAR PASCAL LibMain ( HANDLE hInstance,WORD wDataSeg,WORD cbHeapSize,LPSTR lpszCmdLine ){if (cbHeapSize!=0)UnlockData(0);return (1);}/***********输出函数***********/int FAR PASCAL example(int param1,...,char param n){...... /*C语言应用程序*/}/***********终止函数***********/int FAR PASCAL WEP ( int /*SystemExit*/ ){return(1);}以上各组成部分参数的含义:Windows.h头文件,它包含有数据类型的定义、API入口点定义和其它有用的参数信息。
VC动态链接库
VC动态链接库(2008-09-27 17:09:41)转载标签:vcdll 分类:技术笔记动态链接库(DLL) 是作为共享函数库的可执行文件。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
函数的可执行代码位于一个DLL 中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。
DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个DLL 副本的内容。
可见,动态链接库的主要作用就是共享函数库。
操作系统提供这样一种机制,保证函数库在系统中只有一份实例。
至于DLL中的全局变量,对于每一个进程调用,操作系统会复制一份副本,以避免不同进程之间的干扰。
理论上讲,因为DLL的目的主要在于共享函数库,所提供的函数应尽量具有中立性,不应与应用细节关联太紧密。
因为副本的增加要多占用系统资源与处理负担,所以,应该尽量避免在DLL中使用过多的全局变量,尤其是具有大量数据成员和成员函数的C++全局类对象。
DLL是为面向模块和代码复用而设计,但它却时常被用来作软件之间的分层设计。
用作分层设计目标的DLL,多进程复用没有太多的意义。
实际应用当中也有一种情况,如果一个DLL操控制某个设备在系统中具有唯一性,我们必须要求该DLL考虑不能用于多个进程实例的特性。
然而仅凭操作系统的一些基础性支持,就能做到实例唯一吗?非也,编程者要仔细理解DLL原理与机制,并作大量的练习处理后,才能做到真正的系统实例唯一。
方法之一:在DLL中定义全局变量DLL定义的全局变量可以被调用进程访问;DLL可以访问调用进程的全局数据。
我们可以这样设想,在DLL中定义一标志全局变量,每当进程调用之前,先检查此变量就可以得知是不是已有进程在调用DLL。
然而,DLL中的全局变量会随新进程的应用而拷贝副本。
你在A进程中看到的全局变量Flag_XX与你在B进程中看到的Flag_XX其实不是同一样标记。
所以简单的定义全局变量作进程标记,是不能实现进程应用唯一性的判断。
vb和vc混合编程实例(ocx和dll)
vb和vc混合编程实例(ocx和dll)(转载)前⾔:由于以前⽤vb和vc++封装过dll和ocx⽂件. 或者在⽹上下的类;若重新编写和封装会很费时和费⼒. 如vb简单易⽤,对数据库操作通⽤类进⾏封装.现在vc中可以引⽤之。
另外由于vc执⾏效率⾼,某些较复杂算法或低层处理可在vc中进⾏封装. 这样经常要求混⽤.下⾯是实际中个例⼦记,分vb6.0,vc++各⾃创建和调⽤四个部分1: vb能封装ocx和active dll⽂件. 注意 active dll是⼀种动态,在被调⽤环境中不仅引⽤这个dll,⽽且还要引⽤这个dll所引⽤的其它⽂件,如 DBCommom.dll 是个数据库操作类封装,它引⽤了Ado 接⼝).其创建略,具体引⽤见后.2.vc中做dll时注意要提供接⼝,供其它程式调⽤.a>创建 win32 Dynamic-Link Library 如项⽬CMyTestDllb>加⼊成员function(在 .h中申明 .cpp中实现)//取电脑名称int CMyTestDll::GetComputerNameE(LPTSTR computer_name){DWORD buf=255;LPTSTR strname=new char[buf];if(GetComputerName(strname,&buf)!=0){strcpy(computer_name,strname);return 1;}return 0;}//计算两个值之和int CMyTestDll::Sum(int a, int b){return(a+b);}c.>⼀定要加上CMyTestDll.def ⽂件,并在在其中定义导出各个function及参数,否则不能被调⽤EXPORTSGetComputerNameE @1;Sum @2; @3;d.>编译成dll便可以.最好每个function定义int为返回值.3.vb引⽤vc中dll 和普通API函数⼀样.(vb的long对应 vc的int)'引⽤Private Declare Function GetComputerNameE Lib "⽬录\MyTestDll.dll" (ByVal strName As String) As LongPrivate Declare Function Sum Lib "⽬录\\MyTestDll.dll" (ByVal g As Long, ByVal b As Long) As Long'调⽤Dim str As String * 20 ' 注意对于传址,⼀定要定义其空间⼤⼩(数组可以不指定)dim a As Long, b As Longa=25 b=78result = GetComputerNameE(str)result=Sum(a, b)4.vc引⽤vb中ocx和dll如 C:\TestVb\DBCommon.dll 是个vb做的数据库通⽤类。
VC++动态链接库创建和调用全过程详细讲解
1.概论先来阐述一下DLL(Dynamic Linkable Library)的概念.你可以简单的把DLL看成一种仓库.它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式.如果采用静态链接库.则无论你愿不愿意.lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL.该DLL不必被包含在最终EXE文件中.EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL 文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库.而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库.我们还需建立如下概念:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式.用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API).在任何开发环境中都能被调用.不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll.windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数.其实它就包含在user32.dll这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL.它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL (MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
如何在VisualBasic应用程序中调用动态链接库
如何在 V isual Basic 应用程序中调用动态链接库
烟台师范学院数学与计算机科学系( 264025) 王向阳
摘 要 : Visual Basic 应用程序调用动态链接库的方法、 步骤及应该注意的一系列问题 , 同时给出了 参考性示例。 关键词: Window s 动态链接库 Visual Basic 语言
Declare Funct ion Register ClipboardFormat% L ib User ( By val F ormat Name$ ) % ( As lnteger) % % & $ % % % % % % % &
2 动态链接库函数或过程的调用 全局模块或表格级模块中声 明函数或过程以后, V B 应用程序就可以像调用标准函数一样随意调用动态链接 库函数或过程了。 1 动态链接库函数或过程的调用方法 尽管动态链接库函数或过程的调用执行方式与标准 函数的调用执行方 式完全 一样, 但其 自身 具有的 一系列 特点要求计算机用 户必须 注意数据 类型 的一致 性、 参数 的传递方式及排列方式。 由于在实际工作过程中, 动态链 接库 函数或 过程主 要由 C( 或 C+ + ) 语言开发完成, 其编写和设计均是按 C 语言规范实现的。因此要求 VB 应用程序中 的数据类型 与 C 语言的数据类型相对应, 如表 1 所示。 表 1 C、 Window s 及 Visual Basic 间数据 类型的对应关系
C int unsig ned char unsigned int unsig ned lo ng char far* W ORD W ORD HAN DLE HAN DLE HAN DLE HAN DLE HAN DLE DW ORD W indo ws BOO L BY T E W ORD DW ORD LP ST R AT OM HAN DLE HW ND HICON HDC Visual Basic 动态链接库声明 Byval Integer n/ s Byv el lnteger By val Long By val String Byval Integer Byval Integer Byval Integer Byval Integer Byval Integer
VBA调用外部DLL文件的高级技巧与应用
VBA调用外部DLL文件的高级技巧与应用VBA(Visual Basic for Applications)是一种流行的编程语言,广泛用于Microsoft Office套件中的应用程序如Excel、Word和Access。
VBA内置了许多功能,但有时候我们可能需要更高级的功能来实现我们的需求,这时候就可以借助外部DLL文件来扩展VBA的功能。
DLL(动态链接库)文件是包含可供多个程序共享和使用的代码和数据的文件。
VBA可以通过使用Declare语句来引用DLL文件中的函数和过程,从而实现对其功能的调用。
在本文中,我们将探讨一些VBA调用外部DLL文件的高级技巧和应用。
1. 理解DLL文件的结构与导出函数DLL文件包含了一组导出函数,通过这些函数可以实现对DLL提供的功能的调用。
在VBA中,我们需要了解DLL文件的结构以及导出函数的名称、参数和返回值类型。
2. 声明DLL函数在VBA中,通过使用Declare语句可以声明外部DLL函数的名称、参数和返回值类型。
声明外部函数的正确性对于调用DLL文件非常重要。
例如,下面是一个声明ShellExecute函数的示例:Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA"_(ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFileAs String, ByVal lpParameters As String, _ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long在这个示例中,我们声明了一个名为ShellExecute的函数,它位于shell32.dll文件中。
该函数用于执行操作系统的某些功能,例如打开文件或运行程序。
vb6.0调用cdll文件总结
VB6.0调用C# Dll文件总结VB6.0调用C# Dll文件总结在工作中遇到了在VB6.0的程序里要调用C#的Dll的问题,显然这两个开发环境属于不同的平台。
在网上拜读了几位大师的文章后,在实际试验中还是会发生这样那样的问题,最后还是实现了预期效果,在此我把我的实验步骤和注意事项分享如下,希望对需要之人有所帮助:实验环境:C#dll的创建使用的是VS2008;VB6.0一、C#部分1.用C#创建一个ClassLibrary项目(VS2008);2.所有在VB6中要使用的方法都必须通过继承接口实现,并且为public的(非常重要,没有继承接口实现的方法,在VB6.0里面无法调用);3.接口和类都需要加入属性Guid;Guid通过VS2008自带的工具得到:4.在VS2008的DOS命令工具提示框中运行:sn -k C:\myKey.snk<回车>在C盘根目录下生成一个强名称文件:myKey.snk(注意这个强名称文件的名字可以自己定义,我暂定为myKey.snk)5. 右击项目,选择属性,打开并编辑项目的属性对话框在Application tab中,点击Assembly Information按钮,在打开的对话框中选中“make Assembly COM-Visible”(重要)在Build Tab中,最好用Release模式编译,确认选中“Make assembly COM-Visible”(重要)。
在Signing Tab中引入上一步创建的强名称文件myKey.snk6. 检查项目的AssemblyInfo文件,ComVisible应设为true,项目和文件版本不为1.0.*,应该是一个具体的值;7.编译这个项目,生成dll文件。
到此为止,C#的Dll部分已经准备完毕了。
二、VB6部分1. VB6调用环境必须安装.Net framework2.0或以上版本,最好是3.5(和VS2008相同的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 obj As New t0426a.Class1bel1.Caption = obj.GetString()End Sub注意:以上3,4步,需要在VB6环境的C:\WINDOWS\system32下面有相应的exe文件才可运行;第4步,可以省去;还要说明的是,当转移这个VB6生成的exe程序(这个VB6可执行文件引用了C#的dll)到另外一台电脑上的时候,需要把这个C# Dll文件一同Copy到那台电脑上,并且重新执行第3步的注册生成tlb文件的工作,否则这个exe程序无法运行。
VB6中如何访问C#Dll中的方法、属性以及事件
VB6中如何访问C#Dll中的方法、属性以及事件一个简单的例子实现VB6中访问C# dll中的方法、属性以及事件。
C# DLL1) 要使得C# dll中的方法、属性以及事件在VB6中暴露出来,以便写代码方便,需要加入相应的接口- 方法和属性的接口,本例中为IComInterOpClass[Guid("12A7D9AE-B42F-4a91-9EEE-5E0951A552E2")][InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]public interface IComInterOpClass{//Methodstring SayHello();//Propertystring Name { get; set; }}- 事件的接口,本例中为IComInterOpEvent[Guid("868FD423-2504-4f5c-AB47-9F2B7DB8ED2C")][InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispat ch)]public interface IComInterOpEvent{void EventTest(string msg);}2) 实现部分,注意事件的接口不需要继承,它是以Attribute的方式加入的。
本例中的事件是用timer实现5秒钟触发一次。
namespace ComInterOpLibrary{public delegate void EventTestHandler(string message);[Guid("BA6DF62E-D59E-4e46-B2E6-F1CD990A1E18")][ClassInterface(ClassInterfaceType.None)][ComSourceInterfacesAttribute("ComInterOpLibrary.IComIn terOpEvent")][ProgId("ComInterOpClass")]public class ComInterOpClass : IComInterOpClass{private Timer myTimer = null;//Eventpublic event EventTestHandler EventTest;//Propertypublic string Name { get; set; }public ComInterOpClass(){myTimer = new Timer(5000);myTimer.AutoReset = true;myTimer.Enabled = true;myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);}void myTimer_Elapsed(object sender, ElapsedEventArgs e) {if (EventTest != null){EventTest("Good day!");}#region IComInterOpClass Members//Methodpublic string SayHello(){return"Hello " + Name;}#endregion}}3) 至此,C# dll部分就完成了,最后记得将项目的Register for COM InterOp选上。
在VC实现可在VB中调用的DLL
a = Compare(1, 2)
MsgBox a
End Sub
是不是很简单呢~,呵呵,因为这只是一个测试用的工程,所以我用了最简单的表达方式,本来想写一个运算量大些的函数的,无奈自己实在想不起来什么东西了,抱歉,当然大家看完会问为什么要这样做,为什么这样写的问题,不要着急,我把在VC写DLL需要看和注意的东西都放到下面了,这些都是我在学习写DLL的时候从网络中找到的资料,希望对大家也有帮助:)
如dll要输出如下两个函数:
extern "C" _declspec(dllexport) int _stdcall GetInt(char* name);
extern "C" _declspec(dllexport) char* _stdcall GetStr(int id);
则def文件书写如下(TEST为工程名):
2.文件--新建 新建三个文件 TextDll.cpp(C++代码文件)
TextDll.h(C++头文件)
TextDll.def(模块定义文件,这个文件我是新建的文本文件,在文件名的 地方直接写的TextDll.def,当然你也可以在菜单 工程--增加到工程--文 件 处添加也可以)
3.代码
TextDll.h:
#ifdef __cplusplus
extern "C" {
#endif
__stdcall int CALLBACK Compare (int, int) ;
#ifdef __cplusplus
}
#endif
TextDll.cpp:
VB调用C程序的方法―动态链接库法
VB调用C程序的方法―动态链接库法【摘要】本文将介绍VB调用C程序的方法―动态链接库法。
我们将解释动态链接库的概念以及如何在VB中使用动态链接库调用C程序。
接着我们会详细讲解如何创建动态链接库和在VB中调用动态链接库的步骤。
在最后的注意事项中,我们将强调一些需要注意的细节和技巧。
结论部分将强调VB调用C程序的方法的重要性,并讨论未来的发展方向。
通过本文,读者将了解如何利用动态链接库实现VB和C程序之间的无缝衔接,为软件开发提供更多可能性。
VB调用C程序的方法―动态链接库法在软件开发中扮演着重要的角色,其未来发展方向也值得我们深入探讨。
【关键词】VB调用C程序、动态链接库、概念、使用、创建、调用、注意事项、重要性、未来发展方向1. 引言1.1 VB调用C程序的方法―动态链接库法VB调用C程序的方法―动态链接库法是一种常见且高效的方法,用于实现不同编程语言之间的互操作性。
动态链接库(Dynamic Link Library,简称DLL)是一种共享库,其中包含了可被程序动态调用的函数和资源。
在VB中调用C程序,可以通过创建动态链接库来实现。
首先需要编写一个C程序,并将其编译为动态链接库。
然后在VB中通过声明函数的方式引用这个动态链接库,就可以直接调用其中的函数了。
这样可以充分利用C程序的高性能和灵活性,实现与VB的无缝集成。
需要注意的是,在使用动态链接库时要确保函数的参数和返回值的类型与VB中的数据类型兼容。
要避免内存泄漏等问题,需要注意内存的分配和释放。
VB调用C程序的方法―动态链接库法对于提高程序的性能和扩展功能具有重要意义。
未来可以进一步完善这种方法,提供更加方便快捷的方式实现跨语言调用,促进不同语言之间的交流和合作。
VB调用C 程序的方法―动态链接库法将在跨平台开发和系统集成方面发挥越来越重要的作用。
2. 正文2.1 动态链接库的概念动态链接库(Dynamic Link Library,简称DLL)是一种可被多个程序同时使用的程序代码和数据的集合,它可以在运行时被载入内存,并由多个进程共享。
VB数据库动态连接方法
VB数据库动态连接方法刚做了一个数据库方面的程序,如果是通过控件设置数据库属性,一般是静态,即数据库存放的路径是固定的,如用VB的DATA,adodc,DataEnvironment 等到作数据库链接时,打包后如果存放数据库的路径被改变的话,就会找不到路经,真是一个特别烦的事。
参考了一些人的代码,觉得动态设置数据库路径其实也很简单。
还有就是数据库设置密码的时候连接属性设置会不一样,也顺便总结在一起:刚做了一个数据库方面的程序,如果是通过控件设置数据库属性,一般是静态,即数据库存放的路径是固定的,如用VB的DATA,adodc,DataEnvironment 等到作数据库链接时,打包后如果存放数据库的路径被改变的话,就会找不到路经,真是一个特别烦的事。
参考了一些人的代码,觉得动态设置数据库路径其实也很简单。
还有就是数据库设置密码的时候连接属性设置会不一样,也顺便总结在一起:一、用data控件进行数据库链接,可以这样:在form_load()过程中放入:private form_load()Dim str As String '定义str = App.PathIf Right(str, 1) <> "\" Thenstr = str + "\"End Ifdata1.databasename=str & "\数据库名"data1.recordsource="数据表名"data1.refreshsub end这几句话的意为,打开当前程序运行的目录下的数据库。
你只要保证你的数据库在你程序所在的目录之下就行了。
对于有密码的MDB 文件:以上修改为:data1.databasename=str & "\数据库名"Data1.Connect = "Access 2000;pwd=123"data1.recordsource="数据表名"data1.refresh二、利用adodc(ADO Data Control)进行数据库链接:private form_load ()Dim str As String '定义str = App.PathIf Right(str, 1) <> "\" Thenstr = str + "\"End Ifstr = "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;Data Source=" & str & "\tsl.mdb"Adodc1.ConnectionString = strmandType = adCmdTextAdodc1.RecordSource = "select * from table3"Adodc1.Refreshend sub对于有密码的MDB 文件:以上修改为:注意连接之间的";"。
分享如何在VB中调用VC编写的DLL
分享如何在VB中调⽤VC编写的DLL⼀般来说,VB和VC共同编程有3种⽅式:⼀种是VC⽣成DLL,在VB中调⽤DLL;⼀种是VC⽣成ActiveX控件(.ocx),在VB中插⼊;还有⼀种是在VC中⽣成ActiveX Automation服务器,在VB中调⽤。
相对⽽⾔,第⼀种⽅法对VC编程者的要求最低,但要求你的伙伴进⾏配合,我推荐这种⽅法。
先说说VC++的编程。
⾸先在VC++中⽣成Win32 DLL⼯程。
在这个⼯程中添加⼏个函数供VB⽤户调⽤。
⼀个DLL中的函数要想被VB调⽤,必须满⾜两个条件:⼀是调⽤⽅式为stdcall,另⼀个是必须是export的。
要做到第⼀条,只须在函数声明前加上__stdcall关键字。
如:short __stdcall sample(short nLen, short *buffer)要做到第⼆条,需要在*.def⽂件中加上如下的⼏⾏:EXPORTSsample @1这⾥的sample是你要在VB中调⽤的函数名,@1表⽰该函数在DLL中的编号,每个函数都不⼀样。
注意这⾥的函数名是区分⼤⼩写的。
⾄于你说的需要传递⼤量数据,可以这样做,在VB中⽤⼀个数组存放数据,然后将该数组的⼤⼩和地址传给VC(⾄于如何在VB中编程我会在下⾯介绍)。
就象上⾯的例⼦,nLen是数组⼤⼩,buffer是数组地址,有了这两条,你可以象使⽤VC的数组⼀样进⾏处理了。
⾄于输出图形,可以⽣成WMF或BMP格式,让VB调⽤。
不过,我认为也可以直接输出到视窗,只要VB将窗⼝的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采⽤的坐标系必须⼀致才⾏)传给VC就⾏了。
⽽VB的AutoRedraw属性必须为False,在Paint事件中调⽤VC的绘图程序。
再谈谈VB的编程。
VB调⽤DLL的⽅法和调⽤Windows API的⽅法是⼀样的,⼀般在VB的书中有介绍。
对于上⾯⼀个例⼦,先要声明VC函数:Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer这⾥mydll.dll是你的dll的名字。
VisualBasic中动态链接库的使用
Visual Basic中动态链接库的使用白古勒齐 轩兴涛(呼和浩特市职工大学)(内蒙古建材工业学校) 摘 要 该文介绍了在VB如何使用动态链接库(DLL),使用DLL时调用不同类型参数的声明方法,不同类型VB数据的DLL接收不同方式,VB中数组的DLL操作方法及过程。
关键词 Visual Basic 动态链接库(DLL) 动态链接库(Dy namic Link Libraries,简称DLL)是Microsoft Windo ws的重要特点之一。
程序设计人员利用它可以实现应用程序共享代码和资源,这不但可以提高程序的编写效率,而且可以在多任务环境下大大提高程序的执行效率。
DLL 的最大优点是:1.由于DLL与用户程序分开,用户可以更新DLL而不用更改已编译过的EXE文件。
2.DLL使得我们能够把用C语言编制的数据处理代码动态地链接到用VB开发的应用程序中去,从而可以极大地增强VB的数据处理能力。
1 在VB中使用DLL1.1 声明要使用的DLL子程序要使用的DLL子程序,可以在全局模块(Global Mo dule)中或表格阶层的声明部分(Dec-laratio n Section)中声明。
例1:Private Declare Function OpenProcess Lib “kernel32”(By Valdw DesiredAccess As Lo ng, By Val BinheritHandle A s Long,By Val dw Pro-cessId A s Lo ng)As LongPrivate Declare Functio n CloseHandle Lib “kernel32”(By Val hObject As Long)As Long 1.2 执行DLL子程序同通用函数的执行方式例2:Ret Val=Shell(“C:/WINDOWS/CALC. EXE”,vbNorm alFo cus)2 VB中各种参数的声明从上面的例如1中我们看出,在VB中声明DLL子程序时,函数参数的声明是一项很重要的内容。
【VB技巧】VB静态调用与动态调用dll详解
【VB技巧】VB静态调⽤与动态调⽤dll详解摘⾃:【【请注意】】:在以下语法格式中,请注意 [函数名] 的【⼤⼩写】静态与动态⽐较:静态调⽤简单,动态调⽤⿇烦;静态调⽤占⽤资源多,动态调⽤占⽤资源少;正所谓鱼和熊掌不可兼得。
静态调⽤定义:就是常⽤的申明API,⼀个DLL库⾥有很多的函数可供调⽤,把要⽤的申明即可。
⽐如:Public/Private Declare Function [函数名] Lib "DLL⽂件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]⽰例:Private Declare Function Test Lib "dll.dll" (x As String) As String当程序结束的时候系统回⾃动释放DLL调⽤。
动态调⽤定义:使⽤LoadLibery(DLL名),系统会检查DLL是否调⼊内存。
如果调⼊了,可直接调⽤DLL⾥的所有函数,没有就会把DLL加⼊⽬标进程的进程空间。
通过函数GetProcAddress确定函数⼊⼝地址,然后调⽤,后⼀种⽅法VB⾥不常⽤的。
静态调⽤详解:制作好DLL之后,⾸先⽤Declare声明语句在窗体级或模块级或全局模块的代码声明段进⾏声明,将动态链接库中的函数声明到VB中,供VB程序调⽤。
语法格式1:Public/Private Declare Sub [函数名] Lib "DLL⽂件名" [Alias "别名"] (参数变量表)语法格式2:Public/Private Declare Function [函数名] Lib "DLL⽂件名" [Alias "别名"] (参数变量表) [As 返回值的数据类型]在声明中⾸先⽤Declare关键字表⽰声明DLL中的函数。
在C语⾔中有的函数类型为VOID,它表⽰不具有返回值,则必须⽤关键字Sub将其声明成过程。
一步一步教你用VC和VB挪用C_DLL
Step by Step: Calling C++ DLLs from VC++ and VB 一步一步教你用VC和VB挪用C++ DLL.本系列教程讨论了一般情形下4种利用DLL的方式从VC++应用程序调用C++ DLL的函数Part 1从VC++应用程序调用C++ DLL的类从VB应用程序调用C++ DLL的函数从VB应用程序调用C++ DLL的类从VC++应用程序动态的调用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_API int fnTest(void){return42;}果你此刻编译, 你将会取得一个能够被其他VC++应用程序直接挪用的DLL.许诺其他VC++程序挪用的关键机制?( key mechanism)就包括在中:All files within this DLL#ifdef TEST_EXPORTS#define TEST_API __declspec(dllexport)#else#define TEST_API __declspec(dllimport)#endif};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.当一个VC++应用程序要访问那个DLL的时候,能够将链接进去,它包括了DLL的导出符号.第三步:TEST_EXPORTS在哪里被概念了呢? DLL wizard干了一件我讨厌的事,它把TEST_EXPORTS 放到了命令行里. 选择Project | Settings | C/C++ | General,你将看到工程选然了,那个方法是可行的. 可是它却容易让人忽计,而且可能致使保护上的麻烦. 我比较喜爱清楚明白的概念TEST_EXPORTS : 从项目选项里边去掉/D "TEST_EXPORTS",然后在里来概念它:..注意#define TEST_EXPORTS在#include ""前边. 因此,它概念要在头文件里.此刻,能够像先前那样从头编译咱们的, 咱们将取得一个能够被其他VC应用程序所挪用的DLL.第四步咱们如何挪用DLL里的函数呢? 举个例子吧, 我用VS创建一个例如. 选MFC AppWizard (exe),输入项目名字,然后点OK. 选择基于对话框. 然后点Finish.打开(XXX是你的工程名字.) 找到OnInitDialog()成员函数, 敲进去如下的代码:...The framework does this automatically..第六步若是你想赶时刻做一个演示的话, 你可能会尝试只是拷贝DLL的到你的项目目录里去,那么编译器会找到它. 但是当项目很大的时候,这可不是个好主意, 因为当你更新你的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...Compiling...Generating Code...Linking...: error LNK2001: unresolved external symbol "__declspec(dllimport)public: __thiscall CTest::CTest(void)" (__imp_??0CTest@@QAE@XZ): error LNK2001: unresolved external symbol "__declspec(dllimport)int __cdecl fnTest(void)" (__imp_?fnTest@@YAHXZ)Debug/ : fatal error LNK1120: 2 unresolved externalsError executing .- 3 error(s), 0 warning(s)第七步尽管我已经告知编译器DLL符号啦,可是链接器还不明白. 因此咱们必需告知链接器.. 选择Project | Settings | Link,把DLL的lib文件加到Object/library modules里边去:第八步好啦,此刻编译通过. 在咱们运行程序前,别忘了一件事: 把拷贝到EXE的目录里去.第九步接下来,能够放一个断点到OnInitDialog()函数里去, 点GO(F5)调试运行:能够看到, fnTest返回了42, 和咱们预测的一样. CTest类也能够用类似的方式来测试.要点:•VS的工程向导为咱们创建VC++DLL提供了专门好的开始.••函数,类, 和变量能够从DLL中导出.••利用#define预处置器概念, 一个头文件将能够被DLL 和应用程序一起利用.••DLL导出它的符号,而且应用程序导入那个DLL符号. 当编译应用程序时,编译器通过头文件看到的DLL符号, 当链接应用程序时, 链接器通过导入库看到DLL符号.••当执行应用程序时,DLL必需放到和EXE相同的目录中去. DLL也能够放到windows或system目录中,如此也是可行的, 可是它常常引发某些问题, 因此应该幸免如此利用注释:再实际工作中,我很少用到第七步中的方式. 如此做的话,在大的工程中,DLL和Lib文件将常常变得很难治理.咱们会想到要成立一个lib目录和一个bin目录,在那个地址边放进去所有咱们要利用的lib文件, dll文件和exe文件. 若是如此做的话,咱们怎么告知链接器找到lib文件呢? 有两种方式来做:1.选择Tools | Options | Directories and set Show directories for为"Library files". 在下边添加上咱们工程所利用的Lib文件的途径.2. 另一种方法是,选择Project | Settings | Link, 选category为Input ,在下边的Additional library path 筐里输入工程利用的lib文件的所在途径.哪一种方式更好一点呢?这取决于你的开发环境. 第一种方式要求整个工程要共享的设置目录途径, 而且所有要求所有的开发者的VS都必需设置到这些途径.第二种方式许诺每一个工程定制自己的途径,而且在工程中被贮存,若是开发者的运算机上寄存了一样的目录,那么每一个开发者都能够签出工程而且设计. ,如此能够幸免在每台机械上都去设置一样的途径.到此刻,我尚未说如何指定要利用的LIB文件, 我的方法是在DLL的中添加两行,此刻它看起来像下边的样子:#ifdef TEST_EXPORTS#define TEST_API __declspec(dllexport)#else#define TEST_API __declspec(dllimport)#pragma message("automatic link to ")。
VB调用C程序DLL的一种方法
VB调用C程序DLL的一种方法
吴江滨
【期刊名称】《武汉纺织大学学报》
【年(卷),期】2005(018)003
【摘要】本文提出了一种实现VB调用C语言程序的方法,给出了动态链接库DLL 制作的一般框架,并通过实例描述了DLL制做方法、编程步骤.
【总页数】4页(P37-40)
【作者】吴江滨
【作者单位】武汉科技学院,外经贸学院,湖北,武汉,430073
【正文语种】中文
【中图分类】TP311
【相关文献】
1.VB调用VC创建的DLL及在控制领域中的应用 [J], 薛燕红
2.实现VB调用C程序动态链接库的方法 [J], 顾莉
3.一种64位进程调用32位DLL的方法 [J], 曹子建;容晓峰;刘宝龙
4.DLL在Visual Basic程序调用MATLAB库函数中的应用 [J], 李小文;屠宇;梁慧冰
5.VB调用DLL的方法和实例 [J], 方明伦;王建涛
因版权原因,仅展示原文概要,查看原文内容请购买。