Autor Beitrag
Masteryugi
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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:

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:
library Captcha;

uses
ShareMem,
  SysUtils,
  Classes,forms,
  Controls, dialogs,windows,
  frmCaptcha in 'frmCaptcha.pas' {FCaptcha};

{$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..

ausblenden 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 user profile iconNarses: Quote- durch Delphi-Tags ersetzt
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Do 14.08.08 21:59 
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:
library Captcha;

uses
ShareMem,
  SysUtils,
  Classes,forms,
  Controls, dialogs,windows,
  frmCaptcha in 'frmCaptcha.pas' {FCaptcha};

{$R *.res}

procedure Get_ManualCaptcha(appHandle: THandle;CapURL:string); stdcallexport;
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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 15.08.08 19:34 
ganz minimalistisch sähe der DLL Inhalt so aus (das nil berücksichtigt)

ausblenden 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..

ausblenden 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
BeitragVerfasst: So 30.11.08 21:54 
Ich hatte das gleiche Problem mit der folgenden Funktion.

ausblenden Delphi-Quelltext
1:
function USB_OpenDevice(ProductID:Word):THandle; cdeclexternal '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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: So 30.11.08 22:22 
user profile iconMasteryugi hat folgendes geschrieben Zum zitierten Posting springen:

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:

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:
library Captcha;

uses
ShareMem,
  SysUtils,
  Classes,forms,
  Controls, dialogs,windows,
  frmCaptcha in 'frmCaptcha.pas' {FCaptcha};

{$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..

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: So 30.11.08 23:17 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.