Avatar billede vint Nybegynder
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;
Avatar billede tolderlund Nybegynder
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
Avatar billede vint Nybegynder
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.
Avatar billede vint Nybegynder
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?
Avatar billede a_nor Nybegynder
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.
Avatar billede a_nor Nybegynder
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
Avatar billede vint Nybegynder
05. januar 2007 - 07:38 #6
Tak for det.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester