![]() |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
Zitat:
Zitat:
Zitat:
Trotzdem würde ich gerne wissen, warum sich das Testprogramm aufhängt. |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
Nur schnell zusammengestöpselt, ein Rumpf , Fehlerkorrektur erbeten ...
DLL
Delphi-Quellcode:
library Project2;
uses SysUtils, Classes; Type TCallBackProc=Procedure(info:PChar); TDummyThread=Class(TThread) Procedure Execute;override; End; {$R *.res} Var SaveExit:Pointer; TheCallBackProc:TCallBackProc; procedure LibExit;far; begin ExitProc := SaveExit; end; Procedure InitDLL(CallBackProc:TCallBackProc); var i:Integer; begin TheCallBackProc := CallBackProc; for I := 0 to 100 do with TDummyThread.Create(false) do FreeOnTerminate := true; end; exports InitDLL index 1; { TDummyThread } procedure TDummyThread.Execute; begin inherited; Sleep(Random(2000)); if Assigned(TheCallBackProc) then TheCallBackProc(PChar(Format('Irnedein Testtext %d',[ThreadID]))); end; begin SaveExit := ExitProc; ExitProc := @LibExit; end. Testprogramm
Delphi-Quellcode:
unit Unit3;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TCallBackProc=Procedure(info:PChar); TInitDLL=Procedure (p:TCallBackProc); TForm3 = class(TForm) Memo1: TMemo; Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } FH:Thandle; FInitDLL:TInitDLL; public { Public-Deklarationen } end; var Form3: TForm3; implementation {$R *.dfm} procedure SyncAddToMemo(const s:String); begin Form3.Memo1.Lines.add(s); Application.ProcessMessages; end; procedure CallBack(P:PChar); begin TThread.Synchronize(nil,Procedure begin SyncAddToMemo(P) end) end; procedure TForm3.Button1Click(Sender: TObject); begin if Assigned(FInitDLL) then FInitDLL(@CallBack); end; procedure TForm3.FormCreate(Sender: TObject); begin FH := LoadLibrary(Pchar(ExtractFilePath(Paramstr(0))+'Project2.dll')); if FH<>0 then FInitDLL := GetProcAddress(FH,'InitDLL'); end; procedure TForm3.FormDestroy(Sender: TObject); begin if FH<>0 then FreeLibrary(FH); end; end. |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
@bummi
Mach aus dem
Delphi-Quellcode:
ein
TThread.Synchronize
Delphi-Quellcode:
und das
TThread.Queue
Delphi-Quellcode:
kannst du unter den Tisch fallen lassen ;)
Application.ProcessMessages
Obwohl ich sowieso nicht sehe, wozu das wirklich gut sein soll ... :gruebel: |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
Hast du denn mal die Trial von Eurekalog oder MadExcept ausprobiert (installiert und für beide Projekte, also Hauptprogramm und DLL, aktiviert)? Du musst die ja nicht sofort kaufen, sondern kannst es erst einmal ausprobieren. Du wirst aber denke ich merken, dass die durchaus sehr hilfreich sind und ihr Geld wert sind.
Denn das Programm hängt sich deinem Screenshot zufolge ja nicht auf, sondern hat einfach eine unbehandelte Exception. Die findest du auch in den Dr. Watson Debuglogs, sofern die auf deinem PC aktiviert gelassen sind. Den Stacktrace bekommst du da aber nur in aufbereiteter Form, wenn du .dbg Dateien aus den Delphi-Debugdateien erzeugst. |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
@SirRufo für Queue müsste ich den Thread als Object aus der DLL zurückgeben.
Der Hintergrund was eigentlich nur zu zeigen wo IMHO synchronisiert werden muss. |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
Zitat:
Delphi-Quellcode:
vor)
class procedure
![]() ![]() |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
@SirRufo ich lasse mich gerne belehren ich hatte den Fehler bei der Übergabe von nil auf den fehlenden Thread bezogen.
Du hast recht dieser muss nicht übergeben werden, trotzdem fliegt mir das ganze bei ausreichender Threadanzahl mit Queue um die Ohren, ich vermute weil der übergebene PChar bis zum abarbeiten der Queue ungültig geworden ist. |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
Deshalb nimmt man da ja auch keinen PChar, sondern z.B. einen WideString, wenn etwas asynchron weiterverarbeitet wird.
|
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
Wenn der PChar in einer lokalen string Variable gespeichert wird dann sollte dieser auch problemlos per Queue weitergegeben werden können.
Widestring ist da natürlich wesentlich nkomplizierter :) |
AW: DLL und Callback-Funktion: Hostprogramm reagiert nicht?
Zitat:
Delphi-Quellcode:
Wo da wirklich der Speicher freigegeben wird, wäre ich mir jetzt nicht so sicher...
procedure TTest.Execute;
var a: PChar; begin a := PChar(DupeString('f', 30)); // um keine Konstante zu haben TThread.Queue(nil, procedure begin ShowMessage(a); // fdsdfsd end); a := 'fdsdfsd'; end; (und ich habe grad keine Lust zu schauen ;-)) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 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