直接引用:
http://blog.csdn.net/sigepluto/archive/2007/05/08/1600448.aspx
用VB调用VC编写的DLL时,必须注意参数的匹配。VC中的变量,都是采用的32位,而VB中的,很多是16位,这就要进行相应的转化。转化的法则很多地方都有。我这里建议大家尽量使用VB,VC中都有,而且一致的变量。比如long型和double型。如果可能,尽量采用这些简单的变量类型。可以省缺很多麻烦。
要注意,传递变量值,在VB声明函数是,变量前加ByVal限定字,如果传递指针,要加ByRef限定字。默认为ByRef。
VB和DLL之间传递字符串的情况:
1。从VB传入字符串到DLL
比如下面的函数FuncA,传入字符串到DLL中,在VB中注意要用ByVal声明变量。声明为String型。
Public Declare Function FuncA Lib "***.dll" (ByVal strS As String) As Boolean
在DLL中,
Bool WINAPI FuncA(LPSTR strS)
{
\\ 在这里可以直接使用strS
return TRUE;
}
2。从DLL中传出字符串到VB
VB中的声明:
Public Declare Function FuncB Lib "***.dll" (ByVal strS As String) As Boolean
是不是和上面的声明一样,呵呵,没写错,就是一样的。
在DLL中,
Bool WINAPI FuncB(LPSTR strS)
{
*****
\\ 在程序的最后,可以返回strS。
return TRUE;
}
在这里要注意的是,在VB中要先对strS进行初始化。给strS分配大小。例如,strS = Space$(260) ,这条语句,给strS分配了260个字符的大小。在DLL的函数中,要注意返回的strS的大小,不能超过这个限定。最好能做个判断。比较麻烦,但也没办法,申请个大点的空间吧。
还有一点要注意的是,在DLL中的FuncB中,千万不要对strS进行可能产生地址变更的操作!否则,strS的值不能返回到VB中。最好是在FuncB中使用临时的变量进行操作,程序的最后,把临时变量的值拷贝到strS中去。这样保险,以免出错。
BOOL WINAPI FuncB( LPSTR strS)
{
LPSTR temp;
在这里,对temp变量进行操作,程序的最好,把temp的值拷贝给strS;
strcpy(strS, temp);
return TRUE;
}
具体原因,是因为VB传递给DLL,实际上是strS这个变量的地址,(因为前面用的是ByVal限定词)也就是说是strS的指针。而使用前先分配大小,实际上是初始化指针,否则,是空指针,不能使用。在DLL函数中,如果出现了变更指针地址的操作,比如OLE2A,指针的赋值,指针的清空等等,都会引起 strS地址的变更。这样,strS的值当然不可能传回VB中。
在VB中调用FuncB后,取得的是字符串后面会有一些空字符。比如,你申请了260个字符空间,结果,返回的字符串是“hello“,只有5个字符。那剩下的字符空间,都是空字符。可以使用下面的语句,去掉后面的空字符,只保留”hello“
str = left(strS, InStr(strS, Chr(0)) - 1)
总之,在VB和DLL之间传递数据,要尽量小心,尽量用简单类型。传递字符串时,在最开始,最后使用传递的字符串。中间过程建议采用临时变量替代。
分享到:
相关推荐
本文将深入探讨如何在DLL过程中有效地传递字符串,特别是在使用Visual Basic进行开发时。 首先,我们要了解BSTR字符串类型。BSTR是微软的Automation或OLE自动化框架中定义的一种Unicode字符串格式,它包含一个头...
1. 在VB6中添加引用:由于我们是通过字符串交互,因此需要使用`Declare`语句来声明易语言DLL中的函数。格式如下: ```VB6 Private Declare Function DLLFunctionName Lib "路径\To\Your_DLL.dll" _ Alias "动态...
- 调用声明的函数,传递字符串参数并接收返回值: ```vb Dim result As String result = ConcatenateStrings("你好", "世界") MsgBox result ' 显示"你好世界" ``` 3. **测试与调试**: - 编译并生成VC++的...
在IT行业中,编程语言间的互操作性是一个重要的...总之,VB调用VC-DLL传递字符串涉及到数据类型匹配、字符串转换、内存管理等多个环节。理解这些知识点并熟练应用,能帮助开发者避免在跨语言交互时遇到不必要的麻烦。
例如,假设VB6.0的ActiveX DLL有一个名为`MyFunction`的函数,接受一个整数参数并返回一个字符串,你可以这样调用它: ```cpp #import "path_to_your_dll.tlb" no_namespace named_guids ... CoInitialize(NULL); ...
在编程领域,VB(Visual Basic)和VC(Visual C++)是两种不同的编程语言,分别属于微软的.NET...在实际开发中,应尽量避免复杂的结构体传递,或者使用通用的数据类型如字符串、整数等,以减少潜在的错误和兼容性问题。
注意VB和C++的数据类型不同,因此在传递字符串时,需要特别注意。C++的字符串通常是`char*`,而VB的字符串是`String`类型,需要进行适当的转换。此外,VB的字符串长度是动态的,而在C++中需要指定缓冲区大小,所以...
例如,如果你有一个名为`myDll.dll`的DLL,其中有一个名为`MyFunction`的函数,接受一个整型参数并返回一个字符串,声明可能如下: ```vb Private Declare Function MyFunction Lib "myDll.dll" (ByVal iParam As ...
3. **调用DLL函数**:在VB代码中,你可以像调用普通VB函数一样调用`GetCPUID`函数,然后处理返回值和传递的参数。 4. **处理结果**:DLL函数执行后,通常会返回一个值,比如错误码。你需要检查这个返回值以确定操作...
`CurrentProject.Path`获取当前项目的路径,而`Chr(34)`插入双引号,确保路径字符串被正确解析。 **自动引用DLL:** 虽然`Regsvr32`可以自动注册DLL,但引用DLL的过程通常需要在代码中手动处理。这意味着你仍然...
此外,由于`refprop.dll`不支持Unicode字符串,所以传递到RefProp的字符串必须是ANSI编码的。这可能需要对字符串进行额外的处理,特别是在处理非英文名称的流体时。 总的来说,通过C#或VB.NET调用`refprop.dll`,你...
对于字符串,直接传递字符串即可。代码中可能包含以下关键部分: - `Open` 和 `Close` 语句来打开和关闭文件。 - `FileLen` 函数获取文件大小。 - `Get` 或 `BinaryRead` 用于读取文件内容到字节数组。 - 调用MD5...
本文将介绍两种在VB.NET中判断字符串是否包含汉字的方法,并对这两种方法进行速度上的比较。 #### 方法一:使用正则表达式 这种方法利用了VB.NET中的`Regex`类来匹配指定范围内的Unicode字符,即通常用来表示汉字...
在实际使用时,我们需要按照DLL的接口调用相应的过滤方法,并传递我们的字符串和关键字列表。 总的来说,字符串过滤工具类是软件开发中不可或缺的一部分,它帮助我们处理和管理字符串内容,确保其符合预期的规范和...
假设我们已经制作了一个名为`ADD.DLL`的DLL文件,其中包含了一个名为`ADD`的函数,该函数接受两个整型参数`X`和`Y`以及一个字符串参数`filein`,返回它们的和。 1. **函数声明**: ```vb Declare Function ADD ...
在ASP中,VBDLL(Visual Basic Dynamic Link Library)是VBScript代码封装的库,可以提供更复杂的函数和对象,扩展ASP的功能。Session和Request是ASP中两个至关重要的概念。 **Session对象** Session对象在ASP中用...
以ADD.DLL为例,如果DLL中有一个名为ADD的函数,接收两个整数参数X和Y,以及一个字符串参数filein,返回一个整数,那么在VB中声明如下: ```vb Declare Function ADD Lib "ADD.dll" (ByVal X As Integer, ByVal Y ...
而在VB.NET端,需要使用P/Invoke(平台调用)技术来调用Windows API,例如使用` Marshal.PtrToStringAnsi `或` Marshal.Copy `等方法来读取内存中的字节数组,并将其转换为字符串。此外,还需要确定和管理内存地址,...
综上所述,理解 Variant 参数、OCX 中的字节数组传递和 SafeArray 的使用对于高效地在 VC 和 VB 之间进行组件通信至关重要。掌握这些技巧,开发者可以创建更强大的跨平台组件,提升软件的灵活性和可扩展性。
标题和描述中的知识点聚焦于如何在Visual Basic 5.0(简称VB5.0)中调用Windows API函数,这是一个高级编程技术,允许开发者利用Windows操作系统底层功能来增强应用程序的能力。下面将详细解释这一主题的关键点,...