文档库 最新最全的文档下载
当前位置:文档库 › 在VB中 相对路径引用 DLL

在VB中 相对路径引用 DLL

在VB中 相对路径引用 DLL
在VB中 相对路径引用 DLL

在VB中通过相对路径引用标准DLL

很长时间以来,都认为只能通过绝对路径引用标准DLL中的函数。其实,你也可以用相对路径。

1)绝对路径方法

比如你的DLL文件位于c:\testDLL\debug\testDLL.dll

一般来说,你需要在VB中作如下声明

Declare Sub mytest Lib "c:\testDLL\dubug\testDLL.dll" (ByVal x As Long)

另外的一个变通方法是把testDLL.dll放在windows的系统目录下,这样,你就可

以直接引用文件名了。不过,需要把一个文件放到windows系统目录下,很是不爽!

2)相对路径方法

看看我们如何用相对路径,假设你的DLL文件位于

c:\testDLL\debug\testDLL.dl

l,你的VB程序位于目录c:\testDLL\vbClient

你可以在VB程序中作如下声明:

Declare Sub mytest Lib "../dubug/testDLL.dll" (ByVal x As Long)

如果直接运行你的VB程序,系统会提示错误:找不

到../dubug/testDLL.dll.

为了使上面的声明其作用,先暂时关闭你的VB工程。然后用一个文本编辑器(notepad,editplus,etc)打开工程文件

*.Vbp,通常vbp文件由几个部分组成,比如我的vbp有两部分:Type=Exe

Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0 #0#..\..\..\..\WIND

OWS\System32\stdole2.tlb#OLE Automation

Form=Form1.frm

Module=Module1; Module1.bas

Startup="Form1"

ExeName32="Project1.exe"

Command32=""

Name="Project1"

HelpContextID="0"

CompatibleMode="0"

MajorVer=1

MinorVer=0

RevisionVer=0

AutoIncrementVer=0

ServerSupportFiles=0 VersionCompanyName="American Standard" CompilationType=0

OptimizationType=0

FavorPentiumPro(tm)=0 CodeViewDebugInfo=0

NoAliasing=0

BoundsCheck=0

OverflowCheck=0

FlPointCheck=0

FDIVCheck=0

UnroundedFP=0

StartMode=0

Unattended=0

Retained=0

ThreadPerObject=0 MaxNumberOfThreads=1

[MS Transaction Server]

AutoRefresh=1

你要做的就是在第一部分MaxNumberofThreads=1后添加一行DebugStartupOption

=0。这样,vbp文件就会像下面这样:

......(前面的都一样,故省略)

ThreadPerObject=0

MaxNumberOfThreads=1

DebugStartupOption=0

[MS Transaction Server]

AutoRefresh=1

在编译后直接将DLL文件放入文件运行目录即可。

调用类的方法

语法如下: 语法 [访问修饰符] 返回值的类型方法名([参数列表]){ //方法体 }

(1)访问修饰符 已经讲述过类的访问修饰符,其实同理,这里的方法的访问修饰符功能也是一样,public 表示公共的,private 表示私有的。 在程序中,如果将变量或者方法声明为public,就表示其他类可以访问,如果声明为private,

(2)方法的返回类型。 方法是供别人调用的,调用后可以返回一个值,这个返回值的数据类型就是方法的返回类型,可以是int、float、double、bool、string 等。如果方法不返回任何值,就使用void。

语法 return 表达式; 如果方法没有返回值,则返回类型应该使用void(空虚;空的),用于说明无返回值。 如:public void Singing() //无返回值 { Console.Write(“在唱歌。。。”); } return 语句做两件事情:表示已经完成,现在要离开这个方法;如果方法产生一个值,这个值放置在return 后面,即<表达式>部分。意思就是“离开该方法,并且将<表达式>的值返回给调用其的程序”。

注意:在编写程序的时候,一定要注意方法声明中返回值的类型和方法体中真正的返 回的值的类型是否匹配,如果不匹配,后果很严重。比如在下面这个ToString()方法中,返 回类型是String 类型,因此在方法体中必须用return 返回一个字符串,否则编译器将报错。

(3)方法名 定义一个方法都要有一个名称 注意:方法名主要用于调用这个方法时用,命名方法就像命名变量、类一样,要遵守一定的规则,如必须以字母、下划线“_”或“$”开头,绝对不能以数字开头。

vb调用vc 的DLL

4.1 新建工程 打开在VC++6.0,new一个Win32-Dynamic-Link Library工程dlltest。 4.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 对函数名 最终生成符号的方式不同 */ #endif 4.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 FILE目录,添加一个文本文件(不能是word文档,一般是txt 格式的),将文档重命名为lib.def,点击打开该文档。 在文档中输入代码: LILBRARY dlltest EXPORTS add @ 1 sub @ 2 说明:DLL函数的导出有两种方式。

一种是显式导出:在.h文件中在函数声明前加入如下语句: __declspec(dllexport)。使用该方法是不用添加.def文档的。该方法导出的函数,只能被C或C++调用,不能被其他语言调用。 一种是隐式导出:就是在SOURCE FILE目录中添加一个.def文档,在该文档中写入要导出函数的代码。 .def语法规定注释用分号(;),且注释不能与代码共享一行,代码说明如下:LIBRARY dlltest ;该语句说明了相应的DLL工程。 EXPORTS add @ 1 sub @ 2 ;该语句声明了将DLL工程中导出的函数,只要写入 ;函数名称即可,不用说明返回值以及函数参数。其实@ 1 ;和@ 2是为函数编号所使用的 在添加所有的工程文件后,编译生成dll文件后 4.3 用vc调用DLL 在vc中new一个Win32 Console Application 工程test 代码如下: #include #include typedef int (__stdcall *padd)(int,int) ; typedef int (__stdcall *psub)(int,int) ; int main() { HINSTANCE hd ; hd = LoadLibrary(“填入要调用DLL的路径”) ; if(!hd) { printf(“Load DLL err\n”) ; return 0 ; } padd add = (padd)GetProcAddress(hd,“add”) ; if(!add) { printf(“Get add err\n”) ; FreeLibrary(hd) ; return 0 ; }

过程和子过程的定义和调用方法(精)

实习六 过程和子过程的定义和调用方法 地点:计算机实验室。每名学生一台计算机。 实习时间:90分钟 指导教师:任课教师,实习指导教师 学生分组:每三人为一组。每名教师负责七个组的指导。 实习目的: 1、 掌握自定义函数过程和子过程的定义和调用方法. 2、 掌握形参和实参的对应关系. 3、 掌握值传递和地址的传递方式. 4、 掌握变量、函娄和过程的作用域. 5、 掌握递归概念和使用方法. 熟悉程序设计中的常用算法. 实验6.1 编一子过程ProcMin,求一维数组a 中的最不值,子过程的形参自己确定. 主调程序随机产生10个-300~-400之间的整数,调用ProcMin 子过程,显示 最小值. 实验6.2 编一函数Max(a( )),求一维数组a 中的最大值.主调程序随机产生10个 100~200之间的数,调用Max 函数,显示最大值. 实验6.3 编一个函数过程MySin(x),求 MySin(x)=()()!121...! 7!5!31121753--++-+---n x x x x x n n 当第n 项的精度小于510-时结束计算,x 为弧度.主要程序同时调用MySin 和内

部函数Sin,进行验证. 【提示】 关键是找部分级数和的通项,通项表示如下: ))2()1/((12+?+???-=+i i x x T T i i ......7,5,3,1=i 实验6.4编一个函数过程HtoD(H),将十六进制字符串H 转换成十进制数.主调程序 调用HorD 函数,再调用内部函数Hex(number)进行逆向验证. 实验6.5 参阅教篇例6.2,编一个子过程DeleStr(s1,s2),将字符串s1中出现s2子字 符串删去,结果还是存放在s1中. 例如:s1=”12345678AAABBDFG12345” s2=”234” 结果:s1=”15678AAABBDFG15” 【提示】 解决此题的方法有以下要点: (1) 在s1字符串中找s2的子字符串,可利用lnStr()函数,要考虑到s1中可能存在多个或不存在s2字符串,用Do While Instr(s1,s2)﹥0循环结构来实现. 若在s1中找到s2的子字符串,首先要确定s1字符串的长度,因s1字符串在进行多次删除时,长度在变化..然后通过Left() 、Mid() 或Rigth()函数的调用达到删除s1中存在的s2字符串. 实验6.6 编一函数过程MaxLength(s),在已知的字符串s 中,找出最长的单词.假定 字符s 内只含有字母和空格,空格发隔不同的单词.程序运行界面如图2.6.1 所示

JAVA里面方法调用时传对象参数的陷阱

JAVA里面方法调用时传对象参数的陷阱 类似的问题,又被人问到了几次,决定还是简单总结一下吧。这个问题,一些老手已经很清楚了,但有时也会很不小心的被XX了一把。 其实问题的核心,就是参数虽然是传的引用,但参数就是参数,他自身是一个本地的局部引用而已,设为首页只不过在这个时刻和调用者指向了同一个对象。但并不代表这个局部引用在整个方法调用期间内能始终和调用者保持一致。 下面是2个测试,分别测试可修改的Object和不可修改的 /** * JA V A里面对象参数的陷阱 */ public class Test { public static void main(String[] args) { TestV alue tv = new TestV alue(); tv.first(); TestInteger ti = new TestInteger(); ti.first(); } } class TestV alue { class V alue { public int i = 15; } // 初始化 V alue v = new V alue(); public void first() { // 当然是15 System.out.println(v.i); // 第一次调用 second(v); System.out.println(v.i); third(v); System.out.println(v.i); } public void second(V alue v) { // 此时这里的v是一个局部变量 // 和类属性的v相等 System.out.println(v == this.v); v.i = 20; } public void third(V alue v) { // 重新设置一个对象 v = new V alue();

VB调用动态链接库(DLL)

VB调用动态链接库(DLL) 作为一种简单易用的Windows开发环境,Visual Basic 从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。但凡事有利必有弊。 VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows 交互的机会。因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用 C/C++等开发一些动态连接库,用于在VB中调用。本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。 Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出数据,但

实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。 一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。但也有例外,如16位Windows 的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。 作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题: 1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API

12.4.3 包含实例变量的方法调用[共2页]

COBOL I AM WORKING I AM PLAYING I AM LEARNING COBOL 该段客户程序首先创建了一个基于HUMANCLS类的实例。并且,该程序使用数据部中定义的数据M来引用该实例。其后,该程序通过数据M实现了HUMANCLS类的实例中3个方法的调用。关于HUMANCLS类的原型,同前面章节中的一致。 12.4.3 包含实例变量的方法调用 上一小节仅是使用客户程序实现了最基本的方法调用。在以上所调用的方法中,只包含了一条输出语句,并未涉及到实例中的变量。本节将在此基础上,讨论如何通过客户程序实现包含有实例变量的方法调用。 例如,在HUMANCLS类中有3个实例变量,可分别表示姓名、年龄和心情状态。此处要求通过客户程序,分别调用包含有以上3个实例变量的方法。其中所要实现的功能是能够对实例状态进行设置,并得到该状态的输出信息。 为实现以上功能,首先需要重写HUMANCLS类。不妨将重写后的HUMANCLS类命名为HUMANCLS2。重写后的HUMANCLS2类需要包含6个方法。设置姓名、年龄和心情状态为其中的3个方法。输出姓名、年龄和心情状态信息为另外的3种方法。HUMANCLS2类的代码如下。 IDENTIFICATION DIVISION. CLASS-ID. HUMANCLS2 INHERITS BASECLS. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS BASECLS IS 'BASECLS' CLASS HUMANCLS IS 'HUMANCLS'. * IDENTIFICATION DIVISION. OBJECT. DATA DIVISION. WORKING-STORAGE SECTION. 01 NAME PIC X(10). 01 AGE PIC 999. 01 MOOD PIC X(5). PROCEDURE DIVISION. * IDENTIFICATION DIVISION. METHOD-ID. SETNAME. DATA DIVISION. LINKAGE SECTION. 01 PASS-NAME PIC X(10). PROCEDURE DIVISION USING PASS-NAME. MOVE PASS-NAME TO NAME. END METHOD SETNAME. * IDENTIFICATION DIVISION. METHOD-ID. SETAGE. DATA DIVISION. 25312.4 COBOL中的客户程序

VB如何调用dll函数

VB如何调用dll函数 2008-01-10 17:17 開始習慣孤單 | 分类:VB| 浏览13089次 假如我有个DLL,名为 asdfg.dll 它里面有一个函数 zxc(参数1,参数2) 我要用这个函数,该怎么写? 请高手帮我写出脚本,有时间的话请再加上注释 谢谢!! 2008-01-10 19:50 提问者采纳 1.在工程-引用中将asdfg.dll引用过来 2.dim AAA as asdfg 'asdfg是类模块的名称 Private Sub Form_Load() dim x Set AAA = New asdfg x = AAA.zxc(参数1,参数2)'参数1,2自己写 End Sub 建议你了解一下下面dll的制作方法,理解就更透彻了。下面内容来自百度。 1.新建一个ActiveX Dll,工程名字为vbmytestdll,类模块

名字为mytestdll 2.类模块内容只有一个函数,主要返回DLL的HELLO WORLD Public Function dlltest1() As String dlltest1 = "HELLO WORLD" End Function 3.保存,生成DLL,名字为 vbmytestdll.dll 4.新建一个EXE工程,在菜单: 工程---引用---浏览里找到vbmytestdll.dll,把它引用进来 5.EXE工程代码如下: Option Explicit Dim testdll As mytestdll'类模块名字 Private Sub Form_Load() Set testdll = New mytestdll 'DLL的一个新实例 Me.Caption = testdll.dlltest1 '我的标题=返回DLL的HELLO WORLD

java方法的调用基础入门

1 方法 /* 方法:完成特定功能的代码块。 注意:在很多语言里面有函数的定义,而在Java中函数被称为方法。 方法格式: 修饰符返回值类型方法名(参数类型参数名1,参数类型参数名2...) { 方法体语句; return 返回值; } 详细解释: 修饰符:目前就用public static。后面我们再详细的讲解其他的修饰符。 返回值类型:就是功能结果的数据类型。 方法名:符合命名规则即可。方便我们的调用。 参数: 实际参数:就是实际参与运算的。 形式参数;就是方法定义上的,用于接收实际参数的。 参数类型:就是参数的数据类型 参数名:就是变量名 方法体语句:就是完成功能的代码。 return:结束方法的。 返回值:就是功能的结果,由return带给调用者。 要想写好一个方法,就必须明确两个东西:

A:返回值类型 结果的数据类型 B:参数列表 你要传递几个参数,以及每个参数的数据类型 需求:求两个数据之和的案例 方法的执行特点: 不调用,不执行。 如何调用呢?(有明确返回值的调用) A:单独调用,一般来说没有意义,所以不推荐。 B:输出调用,但是不够好。因为我们可能需要针对结果进行进一步的操作。 C:赋值调用,推荐方案。 */ class FunctionDemo { public static void main(String[] args) { int x = 10; int y = 20; //方式1:单独调用 //sum(x,y); //方式2:输出调用 //System.out.println(sum(x,y));

//System.out.println(30); //方式3:赋值调用 int result = sum(x,y); //result在这里可以进行操作 System.out.println(result); } /* 需求:求两个数据之和的案例 两个明确: 返回值类型:int 参数列表:2个,都是int类型。 */ public static int sum(int a,int b) { //如何实现呢? //int c = a + b; //return c; //c就是a+b,所以,我可以直接返回a+b return a + b; } } 2 方法注意事项

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

一步一步教你用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 variable TEST_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 definition CTest::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_API

远程调用的几种方式

远程调用的几种方式 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB 和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来一探究竟,抛砖引玉,欢迎大家提供更多的实现远程通讯的技术和原理的介绍。 基本原理 要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面去看,网络通信需要做的就是将流从一台计算机传输到另外一台计算机,基于传输协议和网络IO 来实现,其中传输协议有tcp、udp等等,tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都基于这个原理而实现,只是为了应用的易用,各种语言通常都会提供一些更为贴近应用易用的应用层协议。 应用级协议 远程服务通讯,需要达到的目标是在一台计算机发起请求,另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端,这其中又会有诸如one way request、同步请求、异步请求等等请求方式,按照网络通信原理,需要实现这个需要做的就是将请求转换成流,通过传输协议传输至远端,远端计算机在接收到请求的流后进行处理,处理完毕后将结果转化为流,并通过传输协议返回给调用端。 原理是这样的,但为了应用的方便,业界推出了很多基于此原理之上的应用级的协议,使得大家可以不用去直接操作这么底层的东西,通常应用级的远程通信协议会提供: 1. 为了避免直接做流操作这么麻烦,提供一种更加易用或贴合语言的标准传输格式; 2. 网络通信机制的实现,就是替你完成了将传输格式转化为流,通过某种传输协议传输至远端计算机,远端计算机在接收到流后转化为传输格式,并进行存储或以某种方式通知远端计算机。 所以在学习应用级的远程通信协议时,我们可以带着这几个问题进行学习: 1. 传输的标准格式是什么? 2. 怎么样将请求转化为传输的流? 3. 怎么接收和处理流? 4. 传输协议是? 不过应用级的远程通信协议并不会在传输协议上做什么多大的改进,主要是在流操作方面,让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标准,至于传输协议则通常都是可选的,在java领域中知名的有:RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS,来具体的看看这些远程通信的应用级协议:

vb编写DLL学习

怎样用VB编写DLL文件??? 你先打开VB,然后先中“ActiveX Dll”工程,然后开始编辑。编完后,保存一般是以“.cls”和“.vbw”保存。这时你选择“文件”菜单,弹出下拉框,选中“生成.dll”选项,它就会在上面弹出一个进度条“正在生成.dll文件”。生成以后是一个有好象齿轮状的图标。 如果你要引用,就开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到你刚才的“.dll”的文件名,在前面的复选框中打勾,就可以引用你刚才在那里面写的方法等。 在vb6里建新工程时选用建立dll 做好后用vb的引用就可以了 VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS 非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。 VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句: Sub Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If End Sub 然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。这样在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了。然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd: Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long mathadd = a + b End Function 编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是: Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS 注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要: Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long

【IT专家】js函数常见的写法以及调用方法

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 js函数常见的写法以及调用方法 2017/04/01 0 写在前面:本文详细的介绍了5中js函数常见的写法以及调用的方法,平时看别人代码的时候总是看到各种不同风的js函数的写法。不明不白的,找了点资料,做了个总结,需要的小伙伴可以看看,做个参考。1.常规写法(最常见的那种) ?//函数的写法function run () { alert(‘常规写法’);//这里是你函数的内容} // 调用run();2.匿名函数写法(可以想成给变量赋一个函数) ?// 匿名函数的写法var run = function(){ alert(‘这是一种声明函数的方式,左边是一个变量,右边是一个函数的表达式,意思就是把一个匿名的函数表达式赋给了变量myfun,只是声明了一个变量指向了一个函数对象。’);//这里是你函数的内容} // 调用run();3.将方法作为一个对象 ?// 作为对象方法,函数写法,这里创建了两个函数外面用{}包裹起来var Test = {run1:function(){ alert(‘这个必须放在一个对象内部,放在外边会出错!’);//这里是你函数的内容},run2:function(){ alert(‘这个必须放在一个对象内部,放在外边会出错!’);//这里是你函数的内容}}//调用Test.run1();//调用第1个函数Test.run2();//调用第2个函数4.构造函数中给对象添加方法javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。 ?// 给对象添加方法var funName = function(){}; funName.prototype.way = function(){ alert(‘这是在funName函数上的原始对象上加了一个way方法,构造函数中用到’); } // 调用var funname = new text();// 创建对象funname.way();//调用对象属性5.自执行函数js自执行函数查到了几种不同写法,放上来给大家看看 ?//方法1:最前最后加括号(function(){alert(1);}()); /*这是jslint推荐的写法,好处是,能提醒阅读代码的人,这段代码是一个整体。例如,在有语法高亮匹配功能的编辑器里,光标在第一个左括号后时,最后一个右括号也会高亮,看代码的人一就可以看到这个整体。*///方法2:function外面加括号(function(){alert(1);})(); //这种做法比方法1少了一个代码整体性的好处。//方法3:function前面加运算符,常见

在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中就可以声明为: Declare 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是被读出的卡机号,那么就是传址的了。 dim l as integer dim m as integer l=GetMacNo(m) if l=0then label1.caption="卡机号:"&m elseif l=2then msgbox"PC接收超时" elseif l=3then msgbox"应答错误" end if

函数调用有哪几种方式

函数调用有哪几种方式 我们知道在进行函数调用时,有几种调用方法,主要分为C式,Pascal式.在C和C++中 C式调用是缺省的,类的成员函数缺省调用为_stdcall。二者是有区别的,下面我们用 实例说明一下:(还有thiscall和fastcall) 1. __cdecl :C和C++缺省调用方式 C 调用约定(即用__cdecl 关键字说明)按从右至左的顺序压参数入栈,由调用者把 参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数 的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。 _cdecl 是C 和C++ 程序缺省的调用方式。每一个调用它的函数都包含清空堆栈的 代码,所以产生的可执行文件大小会比调用_stdcall 函数的大。函数采用从右到左的 压栈方式。VC 将函数编译后会在函数名前面加上下划线前缀。它是MFC 缺省调用约 定。 例子: void Input( int &m,int &n); 以下是相应的汇编代码: 00401068 lea eax,[ebp-8] ;取[ebp-8]地址(ebp-8),存到eax 0040106B push eax ;然后压栈 0040106C lea ecx,[ebp-4] ;取[ebp-4]地址(ebp-4),存到ecx 0040106F push ecx ;然后压栈 00401070 call @ILT+5(Input) (0040100a);然后调用Input函数 00401075 add esp,8 ;恢复栈 从以上调用Input函数的过程可以看出:在调用此函数之前,首先压栈ebp-8,然后压栈ebp-4,然后调用函数Input,最后Input函数调用结束后,利用esp+8恢复栈。由 此可见,在C语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复 堆栈。 下面看一下:地址ebp-8和ebp-4是什么? 在VC的VIEW下选debug windows,然后选Registers,显示寄存器变量值,然后在选debug windows下面的Memory,输入ebp-8的值和ebp-4的值(或直接输入ebp-8和-4), 看一下这两个地址实际存储的是什么值,实际上是变量n 的地址(ebp-8),m的地址(ebp-4),由此可以看出:在主调用函数中进行实参的压栈并且顺序是从右到左。另外,

JAVA有哪些方法调用语句

abstract (关键字 ) 抽象 [.bstr.kt] access vt.访问,存取 [.kses](n.入口,使用权) algorithm n.算法 [.lg.riem] annotation [java]代码注释 [.n.utei..n] anonymous adj.匿名的[.n.nim.s](反义:directly adv.直接地,立即[direktli, dairektli]) apply v.应用,适用 [.plai] application n.应用,应用程序 [,.plikei..n] (application crash 程序崩溃) arbitrary a.任意的 [ɑ:bitr.ri] argument n.参数;争论,论据 [ɑ:gjum.nt](缩写 args) assert (关键字) 断言 [.s.:t] (java 1.4 之后成为关键字 ) associate n.关联(同伴,伙伴) [.s.u.ieit] attribute n.属性(品质,特征) [.tribju:t] boolean (关键字) 逻辑的 , 布尔型 call n.v.调用; 呼叫; [k.:l] circumstance n.事件(环境,状况) [s.:k.mst.ns] crash n.崩溃,破碎 [kr..] cohesion内聚,黏聚,结合 [k.uhi:..n] (a class is designed with a single, well-focoused purpose. 应该不止这点) [k.ments] const (保留字) constant n. 常量, 常数, 恒量 [k.nst.nt] continue (关键字) coupling耦合,联结 [k.pli.] making sure that classes know about other classes only through their apis. declare [java]声明 [dikl..] default (关键字) 默认值 ; 缺省值 [dif.:lt] delimiter定义符; 定界符

VB封装DLL实例讲解(三)

4 1 2点选DLL 3点打开按钮

5 2 3点选DLL 4点打开按钮

我们可以将注册语句放在窗体的加载事件,自动完成DLL的注册,具体可以参看实例。但如果我们有多个DLL需要批量注册时,可以考虑通过软件打包发布工具来完成DLL的注册工作;也可以事先编写BA T文件,让打包发布时将该BA T文件一并打包发布,安装时运行该BA T文件,来完成N个DLL的批量注册,在些就不多着笔墨,大家可以参看实例包中的BA T文件实例。 (二)DLL自动引用方法 2.1 通过References对象的AddFromFile方法实现自动引用 Dim ref As Reference '申明引用类对象 On Error Resume Next '避免因重复引用造成的错误提示 '实例化引用对象,完成DLL的引用 Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll") 为了避免因重复引用出现的错误,我们可以如上代码中加入Error语句,我们还可以在应用程序退出时,通过对References对象的Remove方法释放DLL或反引用。 Dim ref As Reference '申明引用类对象 '实例化反引用对象 Set ref = References("ClsFindString") '移除引用指定类库 References.Remove ref 说明:根据本人实践,我个人倾向于使用Error语句,因为如果应用程序非正常退出,引用对象没有反引用成功,启动时就难免出现重复引用的错误问题。 2.2 通过DLL唯一标识号实现自动引用 Dim ref As Reference'申明引用类对象 On Error Resume Next '避免因重复引用造成的错误提示 '唯一标识号完成注册,需要DLL标识号,主版本号,次版本 Set ref = References.AddFromGuid("{C5E340E2-C557-4852-AE83-5A0578B6863B}", 1, 0) DLL的标识号是编译生成时就确定了的,这个标识号就是DLL的终生制身份证号,我们可以通过这个唯一标识号来完成DLL自动引用。但此种方法必须具备两个条件,一是DLL已经成功注册,二是我们知道了该DLL的标识号、主版本号、次版本号。 2.2.1获取DLL标识号、主版本号、次版本号方法 Dim ref As Reference '申明引用类对象 '实例化引用类库对象 Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll") Debug.Print ref.GUID '获得DLL唯一标识号 Debug.Print ref.Major '获得主版本号 Debug.Print ref.Minor '获得次版本号

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文件中加上如下的几行: EXPORTS sample @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的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法: sample 10, a(0) 这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。 下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目

相关文档
相关文档 最新文档