`
sun201200204
  • 浏览: 294948 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

在VB和DLL间传递字符串

    博客分类:
  • job
阅读更多

直接引用:
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之间传递数据,要尽量小心,尽量用简单类型。传递字符串时,在最开始,最后使用传递的字符串。中间过程建议采用临时变量替代。
分享到:
评论

相关推荐

    VB进程间通讯演示

    由于演示2中还是通过发消息来传递字符串,不可能传递大块文本,本例综合演示1和演示2达到传递大块文本的功能。 4:Chat 演示2和演示3使用的都是SendMessage来发放通知消息,所以不能异步通讯,SetWindowText不能...

    VB 超强的API浏览器 (源代码)

    在 Visual Basic 6.0 中, Any类型的变量通常用于传递是字符串或 Null 的变量, 您可以通过声明两种(一种使用长型,一种使用字符串)来替换这种 Visual Basic 6.0 的用法。 易语言的函数、类型、常数声明是放在不同的...

    VB拦截windows删除文件(API HOOK)

     顺便说一下,学过C的应该知道字符串要以/0标志结尾,所以dll文件名长度要加上1个字节存放Chr(0)  ‘得到进程的句柄  在目标进程中申请分配一块空白内存区域。内存的起始地址保存在MyDllFileBuffer中。 _  ...

    利用输入法注入DLL

    会根据控制程序传递过来的参数加载目标DLL,这样目标DLL也就随着服务输入法一同注入到 目标程序中了。注意服务输入法是控制程序用WM_INPUTLANGCHANGEREQUEST消息在所有窗口 中自动激活的,如果某个窗口自动激活...

    VB6增强搜索插件 4.13.0.130

    传递使用频率较高函数的字符串参数 对齐升级提示对话框中的版本号 补充了一些注释 去掉了默认标签页 增加关闭其它页面的功能 将TabData?更名为Page 将LogClassInitialize?和LogClassTerminate?函数放入标准...

    Visual C++ 2005入门经典--源代码及课后练习答案

    第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 间接数据存取 ...

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    参数 参数_窗口句柄, 整数型, , FindWindow(字符 (0),“计算器”) .参数 参数_DLL路径, 文本型, , '可以是DLL全路径也可以只是DLL名称 .子程序 超级延时, , 公开, 高精度延时,cpu占用低,窗口不卡死,一次最大可...

    Visual.Basic.6大学教程.pdf

    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 转换...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    SQLiteForExcel:轻量级包装,可从VBA访问SQLite3库

    概述 是一个小型,易于使用的开源SQL数据库引擎。 SQLite for Excel这个项目是一个轻量级包装,可以从VBA访问SQLite3库。... SQLite3.bas VBA模块具有所有VBA声明,并进行参数和字符串转换。 它公开了许多SQLit

    rar压缩软件.rar

    它允许指定带有另外一个参数的 't' 变量,例如,ict=字符串 在上面提 及的所有表中执行区分大小写的搜索。 例子: 1) rar "ic=first level" -r c:\*.rar *.txt 在 c:\*.rar 压缩文件中的 *.txt 文件执行区分...

    Url重写篇视频------本讲将通过实例比较ASP.NET下的三种典型URL重写方案

    要求用户键入查询字符串值将使 URL 的键入变得非常困难,并且只有了解查询字符串参数的用途及其名称/值对结构的富有经验的 Web 开发人员才能够对 URL 进行“删节”。 较好的方法是允许使用切合实际且容易记忆的 URL...

    易语言-资料收集工具(易语言2005年大赛三等奖)

    资料收集工具(易语言2005年大赛三等奖) “Glean资料收集工具”设计文档 ...(2)在新建的主键中建立名为ButtonText的字符串,该字符串的作用是定义按钮上显示的文字。 (3)建立名为Clsid的字符串,其值固定为{1FBA04E

    c#学习笔记.txt

    用引号引起来的字符串括在双引号 (") 内, 并且可以包含包括换码序列在内的任何字符用 @ 引起来的字符串以 @ 开头,并用双引号引起来。用 @ 引起来的字符串以 @ 开头,并用双引号引起来。若要在一个用 @ 引起来的字符...

    Java开发技术大全(500个源代码).

    示例描述:本章学习数组与字符串。 ArrayString.java 字符串数组 assignTwoDime.java 为二维数组赋值 getMaxElem.java 获取数组中的最大元素 incCapicity.java 演示StingBuffer的容量增长 SortDemo.java 排序...

Global site tag (gtag.js) - Google Analytics