Autor |
Beitrag |
Masteryugi
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 14.08.08 21:42
Hallo zusammen..
Beim Coden bin ich auf die Idee gekommen da ich für ein Programm sowieso DLLs verwende auch Formulare in ein solche auszulagern..Im Internet finden sich einschlägige Antworten wie man solche Formulare einbindet..eine davon ist:
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:
| library Captcha;
uses ShareMem, SysUtils, Classes,forms, Controls, dialogs,windows, frmCaptcha in 'frmCaptcha.pas' ;
{$R *.res}
function Get_ManualCaptcha(appHandle: THandle;CapURL:string):string; begin if appHandle = 0 then apphandle := GetActiveWindow; Application.Handle := appHandle; try with TFCaptcha.Create(Application) Do try showmodal; finally Free; end except On E: Exception Do Application.HandleException(E); end; Application.Handle := 0; end;
exports Get_ManualCaptcha; begin end. |
Dabei binde ich die Dll Func Statisch in dem aufrufenden Formular ein und es lässt sich prima starten und auswerten, doch nach dem schließen der main.exe kommt ein lauzeitfehler..
Quelltext 1: 2: 3: 4: 5: 6: 7:
| --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00000006. Lesen von Adresse 00000006'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- |
Was könnte ich tun um diesen zu vermeiden..ich habe auch gegooglet und bin dabei auf folgendes projekt gestoßen www.link-rank.com/dll.htm Dort wird quasi das getan was ich auch tue und ich dachte es könnte ein codefehler meinerseits sein aber als ich dieses Beispielprojekt zum Dll laden öffnete und dann geschlossen hab kam ein ähnlicher Laufzeitfehler.
Was könnter der Grund hierfür sein? (ein Kollege bekommt auch Laufzeitfehler dh liegt nicht an meinem system)..
Vielen Dank schon mal für die Hilfe oders durchlesen
Masteryugi
Moderiert von Narses: Quote- durch Delphi-Tags ersetzt
|
|
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Do 14.08.08 21:47
Wie ist der Sourcecode deiner Anwendung?
Wenn der Fehler auftritt, zeigt dir Delphi eigentlich (ggf.s nach einem Klick auf "Anhalten", oder wie das nochmal heißt), in welcher Zeile das auftritt.
Gib das bitte mal mit an, wenn du was ausfindig machen kannst.
Gruß
alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Do 14.08.08 21:59
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:
| library Captcha;
uses ShareMem, SysUtils, Classes,forms, Controls, dialogs,windows, frmCaptcha in 'frmCaptcha.pas' ;
{$R *.res}
procedure Get_ManualCaptcha(appHandle: THandle;CapURL:string); stdcall; export; begin if appHandle = 0 then apphandle := GetActiveWindow; Application.Handle := appHandle; try with TFCaptcha.Create(Application) Do try showmodal; finally Free; end except On E: Exception Do Application.HandleException(E); end; Application.Handle := 0; end;
exports Get_ManualCaptcha; begin end. |
Du hast ein paar Direktiven vergessen und Die Parameter sowie der Rückgabeweret sind auch falsch.
|
|
Masteryugi 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 14.08.08 23:18
@alias5000:
Das Problem ist ja nicht das während der Programmausführung ein fehler auftritt nein vielmehr dass nach beendigung des Hauptfenters (welches die dll aufruft) es fehler Hagelt..die vielmehr zugriffsverletzungen auf die Dll sind..aber trotzdem wird sie ausgeführt..
Deklaration
Zitat: |
erst..
function Get_ManualCaptcha(appHandle: THandle;CapURL:string):string;external'Captcha.dll';
..
dann:
..
function Get_ManualCaptcha(appHandle: THandle;CapURL:string):string;stdcall;export;external'Captcha.dll';
|
Aufruf:
Zitat: | Get_ManualCaptcha(application.Handle,''); |
@Boldar
beides ging nicht und @Boldar wenn ich das so umbaue wie du es sagst geht der aufruf erst gar nicht mit oder ohne export in der deklarartion..beider erfolglos..
Was meinst du mit
Zitat: | Du hast ein paar Direktiven vergessen und Die Parameter sowie der Rückgabeweret sind auch falsch. |
|
|
alias5000
      
Beiträge: 2145
WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
|
Verfasst: Fr 15.08.08 11:59
Ich würde jetzt mal probieren, statt TFCaptcha.Create(Application) mal als Owner einfach nil zu übergeben.
Gruß
alias5000
_________________ Programmers never die, they just GOSUB without RETURN
|
|
Masteryugi 
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 15.08.08 19:34
ganz minimalistisch sähe der DLL Inhalt so aus (das nil berücksichtigt)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function Get_ManualCaptcha(appHandle: THandle;CapURL:string):string;stdcall;export; var Captcha:TFCaptcha; begin try Captcha:=TFCaptcha.Create(nil); Captcha.showmodal; finally Captcha.Free; end; end; |
Es ist keine Frage das es sich aufrufen und ausführen lässt..doch am ende immer wieder..ich glaube schon bald nicht mehr an einen Codefehler meinerseits aber geht oben von mir angeführtes Programm www.link-rank.com/dll.htm bei euch zu Schließen ohne Laufzeitfehler..wenn ja bin ich mit meinem Latain am Ende..
Quelltext 1: 2: 3: 4: 5: 6: 7:
| --------------------------- Benachrichtigung über Debugger-Problem --------------------------- Im Projekt C:\Test\Project1.exe sind zu viele aufeinander folgende Exceptions aufgetreten: ''Zugriffsverletzung bei 0x5b0f1531: Lesen von Adresse 0x00000014''. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- |
|
|
Norbert Werner
Hält's aus hier
Beiträge: 10
Win 98, Win XP, Vista
Delphi 7, Delphi 2009
|
Verfasst: So 30.11.08 21:54
Ich hatte das gleiche Problem mit der folgenden Funktion.
Delphi-Quelltext 1:
| function USB_OpenDevice(ProductID:Word):THandle; cdecl; external 'specu1a.dll' name 'USB_OpenDevice'; |
Bei mir trat genau die gleiche Fehlermelung auf. Es war zum verzweifeln. Mit dem Debugger im Einzelschritt (F7) konnte ich meine gesamte Routine durchgehen ohne dass es eine Fehlermeldung gab, bis ich bei end; ankam. Ich prüfte die Rückgabewerte. Alles war OK. Sobald ich jedoch das Ende meiner Routine erreicht hatte kam es zu der Fehlermeldung.
Da ich nur ein Anfänger bin, bin ich nicht auf den Gedanken gekommen, statt 'cdecl' 'stdcall' zu verwenden. Nachdem ich die Deklaration auf 'stdcall' geändert hatte, lief meine Routine.
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: So 30.11.08 22:22
Masteryugi hat folgendes geschrieben : |
Beim Coden bin ich auf die Idee gekommen da ich für ein Programm sowieso DLLs verwende auch Formulare in ein solche auszulagern..Im Internet finden sich einschlägige Antworten wie man solche Formulare einbindet..eine davon ist:
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:
| library Captcha;
uses ShareMem, SysUtils, Classes,forms, Controls, dialogs,windows, frmCaptcha in 'frmCaptcha.pas' ;
{$R *.res}
function Get_ManualCaptcha(appHandle: THandle;CapURL:string):string; begin if appHandle = 0 then apphandle := GetActiveWindow; Application.Handle := appHandle; try with TFCaptcha.Create(Application) Do try showmodal; finally Free; end except On E: Exception Do Application.HandleException(E); end; Application.Handle := 0; end;
exports Get_ManualCaptcha; begin end. |
Dabei binde ich die Dll Func Statisch in dem aufrufenden Formular ein und es lässt sich prima starten und auswerten, doch nach dem schließen der main.exe kommt ein lauzeitfehler..
Quelltext 1: 2: 3: 4:
| --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00000006. Lesen von Adresse 00000006'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. |
|
Ich vermute, das Problem liegt am Auruf, der dll-code sieht naemlich OK aus. Hast Du auch im Programm Sharemem verwendet? Evtl. lohnt es sich, mal die dll dynamisch zu laden und entladen, das koennte einen Hinweis darauf geben, was faul ist.
Ich wuerde noch ein try..finally um das Setzen von Application.Handle bauen.
twm
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 30.11.08 22:33
Lasst doch einfach den Quatsch mit ShareMem und Strings als Parameter / Rückgabewerten, wenn man das richtig mit PChars macht, dann gibt es da auch normalerweise keine Probleme. Dies ist ja auch genau der Unterschied zu dem Beispiel, das hier in der Library steht.
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: So 30.11.08 23:17
jaenicke hat folgendes geschrieben : | Lasst doch einfach den Quatsch mit ShareMem und Strings als Parameter / Rückgabewerten, wenn man das richtig mit PChars macht, dann gibt es da auch normalerweise keine Probleme. Dies ist ja auch genau der Unterschied zu dem Beispiel, das hier in der Library steht. |
Wenn die DLL nur von Delphi-Programmen aufgerufen wird, spricht nichts dagegen strings zu verwenden, vorausgesetzt man benutzt sharemem. Strings sind halt deutlich bequemer zu verwenden als PChars, insbesondere, wenn man sie auch aus der DLL zurueckliefern will. Sonst sollte man das natuerlich vermeiden.
twm
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 01.12.08 00:14
Wenn man einmal weiß wie das mit PChars geht macht das kaum einen Unterschied, man schreibt es einfach hin. Klar geht es mit ShareMem ein kleines bisschen einfacher, ich finde aber nicht, dass es deshalb sinnvoll ist, es zu benutzen.
Und sobald man fremde DLLs / WinAPI / ... hat kommt man um PChars ohnehin nicht herum, da finde ich es deutlich einfacher, die einfach immer zu benutzen, wenn es um DLLs geht.
|
|
|