![]() |
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. |
Re: C++ -> Delphi
Moin Robert,
Jo, die DLL exportiert sie:
Delphi-Quellcode:
allerdings, da es sich wohl doch nicht um einen Pointer aufd eine Funktion handelt(?) ist das exportierte bereits die Funktion und daher keine(?) Variable.
exports
LoadDll; |
Re: C++ -> Delphi
Zitat:
Delphi-Quellcode:
Exportierte Funktion:
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.
Delphi-Quellcode:
Ich gehe davon aus, dass mIRC letzteres erwartet.
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. |
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:
Er meint das wäre eine ungültige Typumwandlung.
LoadDll: TFNLoadDll = TFNLoadDll(_LoadDll);
|
Re: C++ -> Delphi
Delphi-Quellcode:
würde gehen.
TFNLoadDll(@_LoadDll)
Geht wohl nicht *g* Schlecht wenn man kein Delphi hat... |
Re: C++ -> Delphi
Moin Nico,
hier übrigens was bei letzterer Methode passiert: Aufruf der DLL: ![]() Wenn ich "OK" geklickt habe: ![]() Wenn ich die DLL erneut aufrufe: ![]() Das ShowMessage kommt daher, da ich das testweise mit in der DLL habe:
Delphi-Quellcode:
Übrigens wenn ich es so mache:
procedure LoadDll(var LoadInfo: TLOADINFO); stdcall;
begin LoadInfo.mKeep := True; ShowMessage(IntToStr(LoadInfo.mVersion)); end;
Delphi-Quellcode:
Gibt es einen erneuten Fehler:
LoadDll: TFNLoadDll = TFNLoadDll(@_LoadDll);
Zitat:
|
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 :) |
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: |
Re: C++ -> Delphi
Zitat:
|
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. |
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