DLL中用STRING的奇怪问题; ( 积分: 50 )

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

wiseinfo

Unregistered / Unconfirmed
GUEST, unregistred user!
为了方便,用了FASTMM4的最新版本,
DLL中:
function ZipFiles(vSourceFiles: string
vZipFilef: string): Boolean;
begin
ShowMessage(vSourceFiles)
//vSourceFiles的值正确传入
ShowMessage(vZipFilef)
//但vZipFilef 没有正确传入,是空的,????????
Result := True;
end;

EXE中调用:
procedure TForm6.Button4Click(Sender: TObject);
type
TZipFiles = function(const vSourceFiles: string
vZipName: string): Boolean
stdcall;
var
Th: Thandle;
ZipFiles: TZipFiles;
ZipUnLoad: TZipUnLoad;
vFileName: string;
vZipName: string;
begin
Th := LoadLibrary('HxLibZipEx.dll')
{装载DLL}
if Th = 0 then exit;
try
ZipFiles := GetProcAddress(Th, PChar('ZipFiles'));
if @ZipFiles <> nil then
begin
vFileName := 'R:/INFO7/Sysinfo.mdb,r:/info7/wisesta.exe';
vZipName := 'C:/FFF.zip';
if ZipFiles(vFileName, vZipName) then
ShowMessage('OK');
end
else
ShowMessage('函数没有找到');
finally
FreeLibrary(Th)
{释放DLL}
end
end;
 
dll中,function ZipFiles(vSourceFiles: string
vZipFilef: string): Boolean;没有声明为stdcall,而exe中,TZipFiles = function(const vSourceFiles: string
vZipName: string): Boolean
stdcall;这里又声明成了stdcall。两边必须一致,如果dll的声明没有stdcall,则你在exe下,就要去掉TZipFiles = function(const vSourceFiles: string
vZipName: string): Boolean
stdcall;这句的stdcall,改声明为TZipFiles = function(const vSourceFiles: string
vZipName: string): Boolean
即可。如下:

type
TZipFiles = function(const vSourceFiles: string
vZipName: string): Boolean;
 
多谢谢,的确如此,我一直以为STDCALL只有在用DLL的时候用得着,
 
问题找到了怎么不结帖?
 
DLL里的函数声明与EXE里的函数声明不一致。
EXE:
TZipFiles = function(const vSourceFiles: string
vZipName: string): Boolean
stdcall;

DLL:
function ZipFiles(vSourceFiles: string
vZipFilef: string): Boolean;
 
zqw0117,结贴,分全给你了,
 
晕,还是没有结帖!!!!!!!!
 
后退
顶部