直接引用:
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之间传递数据,要尽量小心,尽量用简单类型。传递字符串时,在最开始,最后使用传递的字符串。中间过程建议采用临时变量替代。
分享到:
相关推荐
由于演示2中还是通过发消息来传递字符串,不可能传递大块文本,本例综合演示1和演示2达到传递大块文本的功能。 4:Chat 演示2和演示3使用的都是SendMessage来发放通知消息,所以不能异步通讯,SetWindowText不能...
在 Visual Basic 6.0 中, Any类型的变量通常用于传递是字符串或 Null 的变量, 您可以通过声明两种(一种使用长型,一种使用字符串)来替换这种 Visual Basic 6.0 的用法。 易语言的函数、类型、常数声明是放在不同的...
顺便说一下,学过C的应该知道字符串要以/0标志结尾,所以dll文件名长度要加上1个字节存放Chr(0) ‘得到进程的句柄 在目标进程中申请分配一块空白内存区域。内存的起始地址保存在MyDllFileBuffer中。 _ ...
会根据控制程序传递过来的参数加载目标DLL,这样目标DLL也就随着服务输入法一同注入到 目标程序中了。注意服务输入法是控制程序用WM_INPUTLANGCHANGEREQUEST消息在所有窗口 中自动激活的,如果某个窗口自动激活...
传递使用频率较高函数的字符串参数 对齐升级提示对话框中的版本号 补充了一些注释 去掉了默认标签页 增加关闭其它页面的功能 将TabData?更名为Page 将LogClassInitialize?和LogClassTerminate?函数放入标准...
第4章 数组、字符串和指针 141 4.1 处理多个相同类型的数据值 141 4.1.1 数组 142 4.1.2 声明数组 142 4.1.3 初始化数组 145 4.1.4 字符数组和字符串处理 147 4.1.5 多维数组 150 4.2 间接数据存取 ...
参数 参数_窗口句柄, 整数型, , FindWindow(字符 (0),“计算器”) .参数 参数_DLL路径, 文本型, , '可以是DLL全路径也可以只是DLL名称 .子程序 超级延时, , 公开, 高精度延时,cpu占用低,窗口不卡死,一次最大可...
8.9 使用InStr和 InStrRev函数在字符串里搜索子字符串 234 8.10 LTrim$、RTrim$和Trim$ 235 8.11 String$和 Space$ 236 8.12 使用Replace 函数替换子字符串 237 8.13 使用StrReverse函数反转字符串 237 8.14 转换...
18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...
概述 是一个小型,易于使用的开源SQL数据库引擎。 SQLite for Excel这个项目是一个轻量级包装,可以从VBA访问SQLite3库。... SQLite3.bas VBA模块具有所有VBA声明,并进行参数和字符串转换。 它公开了许多SQLit
它允许指定带有另外一个参数的 't' 变量,例如,ict=字符串 在上面提 及的所有表中执行区分大小写的搜索。 例子: 1) rar "ic=first level" -r c:\*.rar *.txt 在 c:\*.rar 压缩文件中的 *.txt 文件执行区分...
要求用户键入查询字符串值将使 URL 的键入变得非常困难,并且只有了解查询字符串参数的用途及其名称/值对结构的富有经验的 Web 开发人员才能够对 URL 进行“删节”。 较好的方法是允许使用切合实际且容易记忆的 URL...
资料收集工具(易语言2005年大赛三等奖) “Glean资料收集工具”设计文档 ...(2)在新建的主键中建立名为ButtonText的字符串,该字符串的作用是定义按钮上显示的文字。 (3)建立名为Clsid的字符串,其值固定为{1FBA04E
用引号引起来的字符串括在双引号 (") 内, 并且可以包含包括换码序列在内的任何字符用 @ 引起来的字符串以 @ 开头,并用双引号引起来。用 @ 引起来的字符串以 @ 开头,并用双引号引起来。若要在一个用 @ 引起来的字符...
示例描述:本章学习数组与字符串。 ArrayString.java 字符串数组 assignTwoDime.java 为二维数组赋值 getMaxElem.java 获取数组中的最大元素 incCapicity.java 演示StingBuffer的容量增长 SortDemo.java 排序...