关于Dll的变参问题。(100分)

  • 主题发起人 主题发起人 yubo
  • 开始时间 开始时间
Y

yubo

Unregistered / Unconfirmed
GUEST, unregistred user!
我在Dll中使用了变参类型事PChar
在使用VC和PB调用它的时候不能把正确的结果传出
 
你是不是用variant?
试试olevariant。
 
我使用的是PChar
function MyVarFunction(var APChar: PChar): boolean; cdecl;export;

begin
APChar := '变参返回成功!';
result := True;
end;
 
呵呵~
pchar本质上就是指针,所以在传递的时候就没有必要再“传址”了
去掉var吧。
 
还是不行
function MyVarFunction(APChar: PChar): boolean; cdecl;
我在VC中调用VC使用的是CString类是不是与这个有关
 
你把cdecl换为stdcall试试?
然后c语言如何调用我不太清楚。
 
PB调的话,偶的经验是写成一个可变记录参数,这样才能正常调用
用VC问题应该不大
以前偶曾经被这问题搞的很惨,偶就是这样解决的,还有问题就问我
type
TPBRtnStru = record
sADOConnectString: PChar;
sExcelFileName: PChar;
sTemplatePath: PChar;
end; //{TPBRtnStru}

function Init(var Stru1: TPBRtnStru): Integer; stdcall;
begin
//
end;
 
to:jzx
PB:
rmytype typemy
int ean
ean = MyVarFunction(typemy)
typemy.BPChar = space(100)
typemy.APChar = space(100)
messagebox('',typemy.APChar+"~r"+typemy.BPChar)

声明:
function ulong MyVarFunction(ref RMyType AType) library "MyTestDll.dll"

delphi:
声明:

function MyVarFunction(var AType: RMyType): integer; stdcall;

function MyVarFunction(var AType: RMyType): integer;
begin
AType.APChar := 'aa';
AType.BPChar := 'bb';
result := 7;
end;

to:远帆
这方法我试过了,不行。
 
typemy.BPChar = space(100)//用之前要先分配空间
typemy.APChar = space(100)
ean = MyVarFunction(typemy)

function MyVarFunction(var AType: RMyType): integer;
begin
strpcopy(AType.APChar,'aa');//你不能直接赋值,就是这里出错
strpcopy(AType.BPChar, 'bb');
result := 7;
end;
这样就应该没问题了,vb调用没问题,vc调用也应该是没有问题的(没有试过)
pb。。。破烂。。。交你个方法识别它

procedure test(var a : pchar);
begin
// strpcopy(@a,'this is a message from dll');//这句根本就是错的(delphi调用都出错),可他能再pb中得到正确的结果
// strpcopy(a,'this is a message from dll');//这句正确的,在除了pb的其他环境可以得到正确的结果
end;



 
把你的代码贴出来,看看。没有必要用记录的。
 
这样:
function MyVarFunction(): PChar; stdcall;;

begin
result := '变参返回成功!';
end;
 
to 远帆
代码都已经写出来了
不用记录用PB调用失败,用其他的象VB调用可以。
to wqxsdly
不能这样用,pchar 谁来释放?
 
to:jzx
谢谢你的答案我已经成功了!我会很快分分的。
但我还想问一下。使用结构其他的语音会不会调用有问题,
从而影响了Dll的使用范围?
to:远帆
代码我已经在前面贴出来了。如果不使用结构你有什么好办法吗?
to:wqxsdly
我是想使用变参函数名返回值,没有问题的。
 
多人接受答案了。
 
后退
顶部