Autor Beitrag
XnikoX
Hält's aus hier
Beiträge: 4

WIN 2000
D6 Ent
BeitragVerfasst: Sa 03.01.04 01:08 
Hallo,
Seit einigen Tagen schreibe ich an einer DLl für mIRC, die Suchergebnise von Google ausgibt.
Soweit so gut. Ich habe alle Funktionen bereits getestet und alles funktioniert. Wenn ich jetzt alles in eine mIRC-DLL übertrage, macht EINE Funktion/Prozedur Probleme.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TGoogleDLL.SourceToList(SearchText: string; Conn: TNMHTTP);
begin
  Conn.Get('http://www.google.de/search?q=' + StrToHex(SearchText));
  GText := Conn.Body;
end;


Wenn ich die Zeile mit Conn.Get "auskommentiere" und GText manuell festlege, kackt mIRC nicht ab.
Habe auch probiert, das ganze als Funktion einzubinden, aber das macht den gleiche Fehler.
Ich vermute, dass mIRC nicht damit klar kommt, dass die DLL eine Verbindung aufbaut.
Leider sind die Fehlermeldungen sehr undeutlich. Windows Fehlermeldungen halt.
Ich habe dann überlegt, ob mIRC die DLL vielleicht sofort wieder "entladen" will, aber die Verbindung noch nicht fertig ist.
In der mIRC-Hilfe steht, wie man in der DLL dafür sorgen kann, dass die DLL nicht "entladen" wird.
Ich werde jedoch nicht schlau daraus, da das Beispiel in C ist und ich selber auch noch nicht der Delphi-Freak bin. ;-)
Hier der Auszug aus der Hilfe:

Zitat:
Keeping a DLL Loaded after a call
By default a DLL is unloaded immediately after you make the /dll or $dll() call. You can keep a DLL loaded by including a LoadDll() routine in your DLL, which mIRC calls the first time you load the DLL:

void __stdcall (*LoadDll)(LOADINFO*);

typedef struct {
DWORD mVersion;
HWND mHwnd;
BOOL mKeep;
} LOADINFO;

mVersion contains the mIRC version number in the low and high words.

mHwnd contains the window handle to the main mIRC window.

mKeep is set to TRUE by default, indicating that mIRC will keep the DLL loaded after the call. You can set mKeep to FALSE to make mIRC unload the DLL after the call (which is how previous mIRCs worked).


Ich hoffe, ich konnte alles möglichst verständlich erklären.
Also das ist der einzige Lösungsweg, der mir derzeit einfällt. Dass die DLL quasi sagt "Stopp! Noch nicht vorbei hier!".
Wenn jemand andere Alternativen hat: Her damit!

Schöne Grüße,
XnikoX


ps.: Bei IdHTTP das gleiche.

_________________
I won't forget what we've been through.
You believe in me ... and I believe in YOU!
RaverJK
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Sa 14.05.05 18:45 
Hi,

ich habe auch danach gesucht und bin zu folgender Lösung gekommen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
type
  TLoadInfo = record
    mVersion: DWORD;
    mHwnd: HWND;
    mKeep: Boolean;
  end;

  PLoadInfo = ^TLoadInfo;

(** procedure LoadDll
  * Falls mIRC diese prozedur nicht findet, wird die dll sofort wieder
  * entladen. Falls doch, bleibt sie. 
  *
  * @param PLoadInfo Pointer auf TLoadInfo
  *    mVersion: mIRC Version
  *    mHwnd: handle des mIRC Hauptfensters
  *    mKeep: kann man auf false setzen, um die dll sofort wieder zu 
  *           entladen (z.B. wenn die mIRC Version zu alt ist)
  * 
  * siehe auch: mIRC Hilfe (/help dll)
  *)

procedure LoadDll(LoadInfo: PLoadInfo); export; stdcall;
begin
  LoadInfo.mKeep := true; //true ist nur formell, funktioniert aber.
end;

(** function UnloadDll
  * @param Timeout 0: mirc wird geschlossen oder der Befehl /dll -u wurde 
  *                   benutzt: mIRC will die dll auf jeden Fall entladen
  *                1: mirc hat die dll 10 min nicht benutzt und versucht sie zu entladen
  *)

function UnloadDll(Timeout: integer): integer; export; stdcall;
begin
  if Timeout = 0 then
  begin
    // hier aufräumen (freigeben v. Objekten, etc.)
    result := 1  //allow unloading (scheint nur formell zu sein, da mIRC die 
                 //                 Rückgabe wahrscheinlich ignoriert)
  end
  else
    result := 0; //keep dll loaded 
end;

function helloworld(mWnd, aWnd: HWND; data, parms: PChar; show, nopause: boolean): integer; export; stdcall;
begin
  StrCopy(data,'Hello World!');
  Result := 3;
End;


Export 
  {...,}
  helloworld,
  LoadDll,
  UnloadDll;

begin
end.


Für die helloworld funktion ist es nicht nötig, die dll im speicher zu behalten. Man ruft sie mit //echo -ag $dll(dllname.dll,helloworld,NOT_USED) auf. (NOT_USED kann irgendwas sein, auch leer, ganz egal)

Ich hoffe, das hilft.

wenn mir jetzt noch einer sagen kann, wie ich aus dem von mIRC übergebenen Handle ein TComponent mache, wäre auch mir geholfen. (Ich möchte ein eigenes Panel über die mIRC_SwitchBar legen, nur so zum ausprobieren...)