Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   C++ -> Delphi (https://www.delphipraxis.net/48205-c-delphi.html)

Robert Marquardt 22. Jun 2005 12:18

Re: C++ -> Delphi
 
Ach so, das Zeugs steht in der DLL.
Dann exportiert die DLL eine globale Variable. Ist denn LoadDll unter den exportierten Namen der DLL zu sehen?
Wenn nicht, dann ist es eine interne Variable der DLL, aber Variablen muessen auf jeden Fall irgendwo zugewiesen werden.

Pseudemys Nelsoni 22. Jun 2005 12:23

Re: C++ -> Delphi
 
Moin Robert,

Jo, die DLL exportiert sie:

Delphi-Quellcode:
exports
  LoadDll;
allerdings, da es sich wohl doch nicht um einen Pointer aufd eine Funktion handelt(?) ist das exportierte bereits die Funktion und daher keine(?) Variable.

NicoDE 22. Jun 2005 12:28

Re: C++ -> Delphi
 
Zitat:

Zitat von Pseudemys Nelsoni
da es sich wohl doch nicht um einen Pointer aufd eine Funktion handelt(?) ist das exportierte bereits die Funktion und daher keine(?) Variable.

Exportierte Funktions-Variable:
Delphi-Quellcode:
library Foo;

uses
  Windows;

type
  PLoadInfo = ^TLoadInfo;
  TLoadInfo = record
    mVersion: DWORD;
    mHwnd  : HWND;
    mKeep  : BOOL;
  end;

procedure _LoadDll(var LoadInfo: TLoadInfo); stdcall;
begin
  LoadInfo.mKeep = True;
end;

type
  TFNLoadDll = procedure(var LoadInfo: TLoadInfo); stdcall;

var
  LoadDll: TFNLoadDll = TFNLoadDll(_LoadDll);

exports
  LoadDll;

begin
  LoadDll := _LoadDll;
end.
Exportierte Funktion:
Delphi-Quellcode:
library Foo;

uses
  Windows;

type
  PLoadInfo = ^TLoadInfo;
  TLoadInfo = record
    mVersion: DWORD;
    mHwnd  : HWND;
    mKeep  : BOOL;
  end;

procedure LoadDll(var LoadInfo: TLoadInfo); stdcall;
begin
  LoadInfo.mKeep = True;
end;

exports
  LoadDll;

begin
end.
Ich gehe davon aus, dass mIRC letzteres erwartet.

Pseudemys Nelsoni 22. Jun 2005 12:36

Re: C++ -> Delphi
 
Moin Nico,

letzteres habe ich direkt übernommen, das hat nicht geklappt (crash).

Ich habe gerade mal das erste versucht, dort gab es leider einen Compilerfehler bei:

Delphi-Quellcode:
LoadDll: TFNLoadDll = TFNLoadDll(_LoadDll);
Er meint das wäre eine ungültige Typumwandlung.

NicoDE 22. Jun 2005 12:39

Re: C++ -> Delphi
 
Delphi-Quellcode:
TFNLoadDll(@_LoadDll)
würde gehen.

Geht wohl nicht *g*
Schlecht wenn man kein Delphi hat...

Pseudemys Nelsoni 22. Jun 2005 12:45

Re: C++ -> Delphi
 
Moin Nico,

hier übrigens was bei letzterer Methode passiert:

Aufruf der DLL:
http://213.39.187.106/m1.JPG

Wenn ich "OK" geklickt habe:
http://213.39.187.106/m2.JPG

Wenn ich die DLL erneut aufrufe:
http://213.39.187.106/m3.JPG

Das ShowMessage kommt daher, da ich das testweise mit in der DLL habe:

Delphi-Quellcode:
procedure LoadDll(var LoadInfo: TLOADINFO); stdcall;
begin
  LoadInfo.mKeep := True;
  ShowMessage(IntToStr(LoadInfo.mVersion));
end;
Übrigens wenn ich es so mache:

Delphi-Quellcode:
LoadDll: TFNLoadDll = TFNLoadDll(@_LoadDll);
Gibt es einen erneuten Fehler:

Zitat:

Konstantenausdruck erwartet

NicoDE 22. Jun 2005 12:50

Re: C++ -> Delphi
 
Wenn es crasht, dann kommentiere den Code in LoadDll aus.
(statt ShowMessage solltest Du MessageBox verwenden... und entferne alle unnötigen Units (ShareMem, Dialogs, Forms...))

Wie auch immer, soweit ich das in den Tutorials zu mIRC-DLLs sehen kann, ist die zweite Variante korrekt (exportierte Funktion).
Falls es bei leerer LoadDll immer noch zu einer Zugriffsverletzung kommt, könnte ich nicht sagen wieso :)

Pseudemys Nelsoni 22. Jun 2005 12:59

Re: C++ -> Delphi
 
Moin Nico,

danke nochmal :)

ich hab mal folgendes versucht:

//echo -a $dll(0) // Anzahl der geladenen DLLs anzeigen

Ergebnis: 0

//echo -a $dll(tv.dll, _tv, -p(Pro7)-m(10)) / DLL laden

//echo -a $dll(0) // Anzahl der geladenen DLLs anzeigen

Ergebnis: 1



Das heisst sie müsste geladen sein, warum ein erneuter aufruf zum crash führt dürfte wohl an mIRC liegen(?).

Danke nochmal für die Hilfe. Sollte doch noch ein Fehler auftreten, poste ich es in 24 Stunden :mrgreen:

NicoDE 22. Jun 2005 13:23

Re: C++ -> Delphi
 
Zitat:

Zitat von Pseudemys Nelsoni
Das heisst sie müsste geladen sein, warum ein erneuter aufruf zum crash führt dürfte wohl an mIRC liegen(?).

Könnte an allem Möglichen liegen, Delphi-RTL, Inialization von diversen Units oder eben mIRC...

ste_ett 22. Jun 2005 13:32

Re: C++ -> Delphi
 
Das Problem liegt darin, dass du nicht einen Typ, sondern einen Pointer auf den Typ übergeben bekommst. :)

Code:
type
  TLoadinfo = packed record
    mVersion: DWORD;
    mHwnd: HWND;
    mKeep: BOOL;
  end;
  PLoadinfo = ^TLoadinfo;

procedure LoadDll(Loadinfo: PLoadinfo); stdcall;
begin
  ShowMessage(
    'mIRC-Version: ' +
    IntToStr(LOWORD(Loadinfo.mVersion)) + '.' +
    IntToStr(HiWord(Loadinfo.mVersion))
  );
end;

function UnloadDll(mTimeout: Integer): Integer; stdcall;
begin
  if (mTimeout = 1) then
    Result := 0;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz