20. december 2006 - 23:38Der 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?
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;
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
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.
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;
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.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.