AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++ -> Delphi

Ein Thema von Pseudemys Nelsoni · begonnen am 22. Jun 2005 · letzter Beitrag vom 22. Jun 2005
Antwort Antwort
Seite 2 von 3     12 3      
Robert Marquardt
(Gast)

n/a Beiträge
 
#11

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#12

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:23
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.
Mario
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#13

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#14

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:36
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:

LoadDll: TFNLoadDll = TFNLoadDll(_LoadDll); Er meint das wäre eine ungültige Typumwandlung.
Mario
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#15

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:39
TFNLoadDll(@_LoadDll) würde gehen.

Geht wohl nicht *g*
Schlecht wenn man kein Delphi hat...
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#16

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:45
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:

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

Zitat:
Konstantenausdruck erwartet
Mario
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#17

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:50
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
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#18

Re: C++ -> Delphi

  Alt 22. Jun 2005, 13:59
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
Mario
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#19

Re: C++ -> Delphi

  Alt 22. Jun 2005, 14:23
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...
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#20

Re: C++ -> Delphi

  Alt 22. Jun 2005, 14:32
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;
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz