20. december 2006 - 23:38
Der er
5 kommentarer og
1 løsning
Kompilerer ikke ved inkludering af DLL-fil
Hej.
Jeg har en funktion i en DLL-fil, som jeg forsøger at inkludere i mit projekt, men når jeg forsøger at kompilere og køre (F9)mit projekt, så stopper kompileringen "i gang med noget" men mit program åbnes ikke. Er det etklassisk problem?
I min DLL-fil:
library Version;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
{$R *.res}
function GetVersion: string; stdcall;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
begin
VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
Result := IntToStr(dwFileVersionMS shr 16);
Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
end;
FreeMem(VerInfo, VerInfoSize);
end;
procedure DllMessage; stdcall;
begin
ShowMessage(GetVersion);
end;
exports
DllMessage,
begin
end.
Og mit projektfil
Under interface afsnuttet:
procedure DllMessage(); External 'Version.dll';
Under implementationafsnittet
procedure TForm1.Button1Click(Sender: TObject);
begin
DllMessage();
end;
21. december 2006 - 10:48
#1
Man kan godt kalde det et klassisk problem.
Du bruger forskellig calling convention i dll og exe.
Det går altid galt.
i det dll bruger du stdcall til procedure DllMessage, så skal du også bruge stdcall i din exe.
Så kan du fjerne stdcall fra function GetVersion, den er unødvendig.
Du kan læse mere her om calling convention:
http://howtodothings.com/computers/a1181-calling-conventions-and-dlls.html
21. december 2006 - 12:12
#2
OK.
I en artikel under Delphi på udvikleren.dk om DLL-filer mente jeg bare at have læst, at man skulle erklære en calling convention og at man burde bruge stdcall, men det har jeg vist blandet sammen.
02. januar 2007 - 15:30
#3
Hej igen.
Jeg har rettet ovenstående kode til flg.:
---
library PrgVersion;
uses
ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, AdvMenus, ToolWin, ComCtrls, ShellApi, StdCtrls, ImgList, Inifiles, ExtCtrls, Grids, AdvCombo, ColCombo;
{$R *.res}
function GetVersion: string; export;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
begin
VerInfoSize := GetFileVersionInfoSize(PChar(ParamStr(0)), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(ParamStr(0)), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
Result := IntToStr(dwFileVersionMS shr 16);
Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
end;
FreeMem(VerInfo, VerInfoSize);
end;
procedure ShowMessagebox; export;
begin
Application.Messagebox(pchar('Du kører version '+getversion),pchar('Version'), mb_OK or mb_IconInformation);
end;
exports
ShowMessagebox,
GetVersion;
begin
end.
--
Men jeg får en fejl. Ikke ved kokmpileringen, men runtime, oftest først når jeg har haft kaldt GetVersion og senere lukker programmet.
Jeg har fået to forskelige fejl. "Invalid Pointer" og "runtime error 217 at ..."
i interface afsnittet af mit program er følgende indsat
function GetVersion:string; external 'PrgVersion.dll';
og senere i implementation afsnittet kalder jeg getversion;
Kan i se en fejl her?
04. januar 2007 - 23:55
#4
Du bruger ShareMem i Library-et. Så skal DelphiMM.DLL også være tilgængelig når programmet kører, ikke? Og sharemem skal kun være tilgængelig hvis du bruger LongStrings. Er Longstring default? Da skal Sharemem også placeres først i uses-sætningen i den unit der kalder Getverion.
Iøvrigt er det vel OK med StdCall i dll-er. Så kan library-et også bruges i VB og C mv.
05. januar 2007 - 01:01
#5
Undskyld, ShareMem skal også være i din Project (.DPR) -fil, ikke den kaldende unit.
Dette fjerner dine "Invalid Pointer" og "runtime error 217 at ..." fejl