VB调用Delphi编的dll如何传递string变量,并取回修改值?(50分)

  • 主题发起人 主题发起人 ldg
  • 开始时间 开始时间
L

ldg

Unregistered / Unconfirmed
GUEST, unregistred user!
VB调用Delphi编的dll,将string变量全部作为参数传给dll,处理完后<br>想取回修改后的变量值.但试过integer变量可以,string变量不行,不<br>知为什么?我在delphi里声明的是var类型的PChar参数.VB调用用默认方式<br>,没有用ByVal.<br><br>
 
用ByVal 应该可以
 
use ByRef and try again, if not changed, check the dll.<br>
 
ByVal肯定不行.
 
把你的DLL和VB调用的例子贴出来,我帮你试一下.
 
dll:<br>library sat2;<br><br>uses<br>&nbsp; SysUtils,<br>&nbsp; Classes;<br>&nbsp;function aaa(var str1:PChar):integer;stdcall<br><br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; str1:='abc';<br>&nbsp; &nbsp; end;<br>exports<br>aaa;<br>begin<br>end.<br>&nbsp;<br><br>VB中调用:<br><br>Private Declare Function aaa Lib "sat" (ByVal str2 As String) As Integer<br>Private Sub Command1_Click()<br>Dim sss As String<br>sss = "aaaa"<br>abc = aaa(sss)<br>MsgBox (sss)<br>End Sub<br><br><br>调用结果:变量sss仍为"aaaa",而没有变为"abc",且非法操作死机.<br>望指点.<br>
 
问题在此:<br>&nbsp;function aaa(var str1:PChar):integer;stdcall<br><br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; str1:='abc';<br>&nbsp; &nbsp; ^^^^^^^^^^^^<br>&nbsp; &nbsp; end;<br><br>改成strcopy(str1, pchar('abc'));<br>str1 := 'abc'替换了str1的地址, 所以非法操作.
 
function aaa(var str1:&lt;font color=red&gt;String&lt;/font&gt;):integer;stdcall<br>
 
Another_eYes和cAkk的方法都行不通,运行时提示非法操作.
 
???<br>难道vb的string型不是根据c++的类型而是和delphi的string型一样?<br>我怎么记得vb的string也是个#0结尾的字符串(delphi中的pchar)?
 
不可能. 我把你的代码拷贝下来,修改后直接运行,一切正常后才回答你问题的!<br>把DLL参数改成string肯定没问题!
 
eyes: VB的String和Delphi的一样.
 
忘了说了:<br>Private Declare Function aaa Lib "sat" (&lt;font color=red&gt;ByVal&lt;/font&gt; str2 As String) As Integer<br>把红字去掉!<br><br>我不是已经告诉你了吗? 不要用ByVal.<br>
 
我接受cAkk的答案,且Another_eYes <br>的答案如果在调用时把ByVal去掉也可以.
 
我刚做了一个这方面的例子,我用的方法和ANOTHER——EYES的相同,ByVal是必须要的,<br>如果不要的话,虽然也能取值,但都是错的,而且在其他处理后,再重复操作,取值都不<br>同了。
 
后退
顶部