﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-_NH_HN_</title><link>http://www.cppblog.com/ninghui8673/</link><description>心存于天地之间，给我一双翅膀带你自由飞翔</description><language>zh-cn</language><lastBuildDate>Tue, 09 Jun 2026 20:04:25 GMT</lastBuildDate><pubDate>Tue, 09 Jun 2026 20:04:25 GMT</pubDate><ttl>60</ttl><item><title> [转载]在VB和DLL间传递字符串</title><link>http://www.cppblog.com/ninghui8673/archive/2009/02/04/72995.html</link><dc:creator>天凌心</dc:creator><author>天凌心</author><pubDate>Wed, 04 Feb 2009 09:04:00 GMT</pubDate><guid>http://www.cppblog.com/ninghui8673/archive/2009/02/04/72995.html</guid><wfw:comment>http://www.cppblog.com/ninghui8673/comments/72995.html</wfw:comment><comments>http://www.cppblog.com/ninghui8673/archive/2009/02/04/72995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/ninghui8673/comments/commentRss/72995.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/ninghui8673/services/trackbacks/72995.html</trackback:ping><description><![CDATA[&nbsp;用VB调用VC编写的DLL时，必须注意参数的匹配。VC中的变量，都是采用的32位，而VB中的，很多是16位，这就要进行相应的转化。转化的法则很多地方都有。我这里建议大家尽量使用VB，VC中都有，而且一致的变量。比如long型和double型。如果可能，尽量采用这些简单的变量类型。可以省缺很多麻烦。
<p>要注意，传递变量值，在VB声明函数是，变量前加ByVal限定字，如果传递指针，要加ByRef限定字。默认为ByRef。</p>
<p>&nbsp;</p>
<p>VB和DLL之间传递字符串的情况：</p>
<p>1。从VB传入字符串到DLL</p>
<p>比如下面的函数FuncA，传入字符串到DLL中，在VB中注意要用ByVal声明变量。声明为String型。</p>
<p>Public Declare Function&nbsp; FuncA Lib "***.dll" (ByVal strS As String) As Boolean</p>
<p>在DLL中，</p>
<p>Bool WINAPI FuncA(LPSTR strS)<br>{<br>\\ 在这里可以直接使用strS<br>&nbsp;return TRUE;<br>}<br></p>
<p>2。从DLL中传出字符串到VB</p>
<p>VB中的声明：</p>
<p>Public Declare Function FuncB Lib "***.dll" (ByVal strS As String) As Boolean<br>是不是和上面的声明一样，呵呵，没写错，就是一样的。</p>
<p>在DLL中，</p>
<p>Bool WINAPI FuncB(LPSTR strS)<br>{</p>
<p>*****<br>\\&nbsp;在程序的最后，可以返回strS。<br>&nbsp;return TRUE;<br>}</p>
<p>在这里要注意的是，在VB中要先对strS进行初始化。给strS分配大小。例如，strS = Space$(260) ，这条语句，给strS分配了260个字符的大小。在DLL的函数中，要注意返回的strS的大小，不能超过这个限定。最好能做个判断。比较麻烦，但也没办法，申请个大点的空间吧。</p>
<p>还有一点要注意的是，在DLL中的FuncB中，千万不要对strS进行可能产生地址变更的操作！否则，strS的值不能返回到VB中。最好是在FuncB中使用临时的变量进行操作，程序的最后，把临时变量的值拷贝到strS中去。这样保险，以免出错。</p>
<p>BOOL WINAPI FuncB(&nbsp; LPSTR&nbsp;&nbsp; strS)<br>{<br>&nbsp;LPSTR temp;<br>&nbsp;在这里，对temp变量进行操作，程序的最好，把temp的值拷贝给strS;<br>&nbsp;strcpy(strS, temp);<br>&nbsp;return TRUE;<br>}<br>具体原因，是因为VB传递给DLL，实际上是strS这个变量的地址，（因为前面用的是ByVal限定词）也就是说是strS的指针。而使用前先分配大小，实际上是初始化指针，否则，是空指针，不能使用。在DLL函数中，如果出现了变更指针地址的操作，比如OLE2A，指针的赋值，指针的清空等等，都会引起strS地址的变更。这样，strS的值当然不可能传回VB中。</p>
<p>在VB中调用FuncB后，取得的是字符串后面会有一些空字符。比如，你申请了260个字符空间，结果，返回的字符串是&#8220;hello&#8220;，只有5个字符。那剩下的字符空间，都是空字符。可以使用下面的语句，去掉后面的空字符，只保留&#8221;hello&#8220;</p>
<p>str = left(strS, InStr(strS, Chr(0)) - 1)</p>
<p>总之，在VB和DLL之间传递数据，要尽量小心，尽量用简单类型。传递字符串时，在最开始，最后使用传递的字符串。中间过程建议采用临时变量替代。</p>
<img src ="http://www.cppblog.com/ninghui8673/aggbug/72995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/ninghui8673/" target="_blank">天凌心</a> 2009-02-04 17:04 <a href="http://www.cppblog.com/ninghui8673/archive/2009/02/04/72995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>