Dll调用问题。(100分)

  • 主题发起人 主题发起人 wenyian0928
  • 开始时间 开始时间
W

wenyian0928

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Delphi7中写了个Dll,然后在VB中调用,怎么参数也传不进去,如何呀?

Delphi7:
procedure Test(var aaa:ShortString); stdcall;
begin
aaa := '3';
end;

exports
Test;

VB:
Private Declare Sub Test lib "TestDll.dll"(aaa String)
调用:
dim a as String
Call Test(a)
Form1.Caption=a
出错了。

将Delphi中的aaa定义为pChar,
procedure Test(var aaa:pChar); stdcall;
不报错,但值不能传递。
请问高手,问题出在哪里?
 
去掉var 试试
 
我的本意就是写一个过程(不是函数,我用函数也没试成功)传递一个变量到VB里,去掉var,就没意义了。
如果真的去调var,aaa:='3'这句将不会被执行。参数无法传递。
 
你把它换成变量类型换成PChar或者WideString试试
 
汗,你连var都不知道为什么用,还要给俺解释什么去掉var就没意义了
谁的参数不适传递变量的
1、一般不要用string或者动态数组类型等字符串类型的数据类型作为参数
因为他要用到borlndMM.dll,而这是Delphi ShareMM单元的,所以一般用
指针作参数。
2、用var的时候一般情况是在内存映射文件中采用,传递一个共享数据指针
过来
3、建议你再看看书
 
你把它换成变量类型换成PChar或者WideString试试
试过了,仍然不行。
 
那就使用Variant吧
其实VB的数组在底层也是用这个类型的
如果还不行
那你就直接传指针好了
调入DLL后,内存地址是可以共享的
 
to uiit:
你说的我还是不太明白。
一:我用的参数是pChar或ShortString,并没有用String类型,所以不存在调用borlndMM.dll的问题。
二:就如你所说的,去掉var,Delphi编译时,提示:aaa:='3'这句不会被执行。这句都不被执行,值又如何传递到VB中。
 
这个问题实际上,就是用delphi如何给Vb传递一个字符串参数。
望高手出招。
 
我用函数调用成功过,过程应该也是一样。
VB的解决方法有两种:
一、用DELPHI写个COM形式的DLL来进行传递或者封装现有的这个API形式的DLL,
二、直接用VAR或者OUT对参数进行申明然后进行传递,都可以的,你要注意最好使用PAnsiChar类型,然后在赋值的时候用StrPCopy(aaa,'3');
procedure Test(var aaa:PAnsiChar); stdcall;
begin
StrPCopy(aaa,'3');
end;
 
to 明月几时有:
我用你方法,用函数的形式,通过了,但用过程没有通过。不知为何,能否提示提示。
 
这个涉及到型参和实参的问题,你自己再看看书就知道了。
另外,delphi写的dll里应该是个函数,不是过程。暂时就看到这两个错误。
 
怪事:
Delphi中代码:
function Test: pChar; stdcall;
begin
GetMem(Result,255);
Result := '3333333333333';
end;

exports
Test;

VB调用:
Command1.Caption=Test


GetMem(Result,255);
这句,Delphi编译时,提示不被执行,
但没有这句,VB调用出错。
有了这句调用正常,怪事。
高手能不能分析一下原因。
 

Similar threads

后退
顶部