愚见: 用C编写函数时使用的是LPSTR,DELPHI中应当用PChar类型对应吧!(string与PChar处理上是不同的); 若使用DELPHI编写该函数,在使用DELPHI向导生成的DLL的主文件(.dpr)会有一段说明,当使用string类型做为参数传递时,需要在USES中加上sharemem单元来引用BORLNDMM.DLL的内存管理。 还有,此时的外部函数的调用声明可以使用STDCALL关键字。
愚见: 用C编写函数时使用的是LPSTR,DELPHI中应当用PChar类型对应吧!(string与PChar处理上是不同的); 若使用DELPHI编写该函数,在使用DELPHI向导生成的DLL的主文件(.dpr)会有一段说明,当使用string类型做为参数传递时,需要在USES中加上sharemem单元来引用BORLNDMM.DLL的内存管理。 还有,此时的外部函数的调用声明可以使用STDCALL关键字。
function PassStr(para:string):longint; StdCall; external 'testdll.DLL';如果不行将StdCall改为cdecl;
function PassStr(para:string):longint; cdecl; external 'testdll.DLL';好像不要far也可以.
library ProjectDLL;{%File 'longint'}uses
ShareMem,
SysUtils,
Classes,
Dialogs;function PassStr(pStr:Pchar):longint;stdcall;
begin
MessageDlg(pStr,mtInformation,[mbOK],0);
Result:=1;
end;{$R *.RES}
exports
PassStr;end.
library ProjectDLL_;uses
SysUtils,
Classes,
Dialogs; function PassStr_(Str:String):longint;stdcall;
begin
ShowMessage(Str);
Result:=1;
end;{$R *.RES}exports
PassStr_;
end.调用函数单元:
function PassStr(pStr:Pchar):longint;stdcall;external 'ProjectDLL.DLL';
function PassStr_(Str:string):longint;stdcall;external 'ProjectDLL_.DLL';procedure TForm1.Button1Click(Sender: TObject);
begin
PassStr('PChar OK!');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
PassStr('String OK!');
end;已经调试通过。
还有,当使用DELPHI向导建立自动化对象时,为接口添加一个方法,当在可视编辑环境下传递long类型参数时,导出的Delphi源代码文件的对应函数的参数类型为integer。 所以,建议你用integer类型的传递给VC看看,要不就干脆使用__int64(Delphi对应为int64)类型喽!
还有,当使用DELPHI向导建立自动化对象时,为接口添加一个方法,当在可视编辑环境下传递long类型参数时,导出的Delphi源代码文件的对应函数的参数类型为integer。 所以,建议你用integer类型的传递给VC看看,要不就干脆使用__int64(Delphi对应为int64)类型喽!