delphi调用vc的dll的函数不能返回参数??(100分)

  • 主题发起人 主题发起人 scorpions
  • 开始时间 开始时间
S

scorpions

Unregistered / Unconfirmed
GUEST, unregistred user!
1:delphi调用vc的dll的函数可以输入参数,不能输出参数?
(vc调用delphi的也是如此)delphi调delphi的没问题。

实参好像只能用指针类型(如:char**)
不知delphi用什么类型对应?(^pchar吗?)

若c函数:
int test(char** a)

那delphi用什么类型?怎么调用?

2: 但函数返回值用记录类型怎么不能返回vc的结构体类型函数?
是不是也要用指针类型?

3:怎样在win2000中把输入法的ctrl+空格给屏蔽掉?
我把输入法都删除后在delphi中还是不能用ctrl+空格?
 
返回值都用指针类型,试试用@a之类地址传递。
 

若vc函数:
int test(char** a)

若我的a参数返回多个值,vc用char**好像可以。

那delphi用什么类型对应?怎么调用?



 
Var
ppchar:^PChar;
 
vc的函数:
int test(char** c1)
{
*c1="123";
return 1;
}

delphi调用:
type
ppchar=^pchar;

var
function test(var c1:ppchar):integer;stdcall;external'testdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
a:ppchar;
// b:pchar;
begin
new(a);
test(a);
edit1.text:=a^;
dispose(a);
end;

edit1.text取出来全是乱码?

 
ppchar 换成array[0..23]of PChar;
 
把new(a);改为GetMem(a,20);把dispose(a);改为FreeMem(a)
 
var
function test(var c1:pointer):integer;stdcall;external'testdll.dll';

procedure TForm1.Button1Click(Sender: TObject);
var

a:pchar;
begin
getmem(a,50);
test(@a);
edit1.text:=a;

freemem(a,50);
end;

这样能返回正确的参数。

为什么不能在函数中声明指针型的参数?
function aaa(var c:^pchar):integer;
只能
type
ppchar=^pchar;
function aaa(var c:ppchar):integer;


 
type
ppchar=^pchar;
var
function test(var c1:ppchar):integer;stdcall;external'testdll.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
a:pchar;
c2:ppchar;
begin
new(c2)

c2:=@a

test(c2);
edit1.text:=c2^;

dispose(c2);
end;

这样写可以取出vc的char**的值。但不能取出整形指针的值?


 
vc函数参数是结构体指针。结构体中2个char*变量。用C++Builder调用没问题。
用delphi调用能取出结构体中char*的值,但报错。不知问什么??

type
myrec=record
aa:pchar;
bb:pchar;
end;
pmyrec=^myrec;
var
Form1: TForm1;
function getNewMessage(var newm:pmyrec):integer;stdcall;external'test.dll';
implementation
{$R *.DFM}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
m1,m2:pchar;
test:pmyrec;
begin
new(test);
getNewMessage(test);
m1:=test^.aa;
m2:=test^.bb;
dispose(test);
end;



 
pascal语法规定:函数、过程的参数的类型指定只能用类型标识符才能保证类型的一致性;
凡要通过参数返回结果的,形式参数与实参的类型必须一致。
 
var
aa:PChar;
aa1:pointer;
begin
aa1:=@aa;
end;
 
2000输入法调整按键顺序的那个Listbox太小气,你看不到下面的,滚动一下就知道了.:)
 
多人接受答案了。
 
后退
顶部