Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EAccessViolation mögliche Ursachen (https://www.delphipraxis.net/1253-eaccessviolation-moegliche-ursachen.html)

michael-calvin 6. Nov 2002 19:30


EAccessViolation mögliche Ursachen
 
Hallo Delphi-Freaks,

was sind mögliche Ursachen für eine EAccesViolation-Exception?

Beim einbinden von zwei *.TBL-Dateien in denen Typdefintionen und
OLE-Server-Befehle in Form von Funktionsaufrufen definiert werden
tritt der Fehler auf.

Allerdings nur bei einem Programm das noch mit zwei anderen
Busanbindunngen (PMon und UDP) arbeitet.

Manchmal tritt auch eine EOleSysException auf
Message "CoInitialize wurde nicht aufgerufen".

Diese Exception scheint in der *.TBL deklariert worden zu sein.

Gibt es noch andere Ursachen als die die in der Hilfe genannt werden?

- einen nil-Zeiger dereferenziert,
- in eine Code-Page schreibt oder
- versucht, auf eine Speicheradresse zuzugreifen, für die der Anwendung
kein virtueller Speicher zugewiesen wurde.

bzw. wie kann eine dieser Ursachen überhaupt auftreten?

könnte so etwas auftreten wenn man alle möglichen DLLs die UDP, OLE
usw. gleichzeitig benutzt?

Wie könnte ich versuchen die Fehlerquelle weiter einzugrenzen?
:?:

Bin dankbar für jeden Hinweis

Gruß Michael

Daniel 6. Nov 2002 19:45

Hallo MC,

erstmal herzlich willkommen hier in der Delphi-PRAXiS. :P
Den einen Fehler mit der Meldung "CoInitialize wurde nicht aufgerufen" kannst Du schnell selber beheben: Rufe diese Funktion auf, bevor Du auf Dein COM-Objekt zugreifst und rufe beim Beenden Deiner Anwendung "CoUninitialize" auf. Beide Funktionen sind in der Unit "ole2.pas" deklariert.

Im Artikel "MSDN-Library :: CoInitialize" findest Du weitere Informationen.

Was die restlichen Fehler angeht, so kann ich Dir leider auch nicht weiterhelfen. :roll:


Grüße,
Daniel

Christian Seehase 6. Nov 2002 22:22

Moin Michael,

am besten packst Du CoInitialize in den initialization Abschnitt und CoUninitialize in den finalization Abschnitt der Unit des Hauptformulares.
Diese beiden Funktionen müssen einmal je Thread aufgerufen werden, und das sollte dann möglichst früh (CoInitialize) bzw. möglichst spät (CoUninitialize) erfolgen.

Zitat:

Zitat von Michael
Wie könnte ich versuchen die Fehlerquelle weiter einzugrenzen?

Ich hoffe mal, dass Du die Stelle im Programm, an der der Fehler auftritt einigermassen wirst eingrenzen können.
An dieser "verdächtigen" Stelle setzt Du dann einen Breakpoint und gehst im Einzelschritt durch, bis der Fehler auftritt.
Dann hast Du zumindest schon mal die Stelle an der etwas unzulässiges passiert, und kannst Dir überlegen, was denn nun die Ursache ist.

Genauer geht's leider nicht, denn es gibt, wie Du schon selber gesagt hast, viele mögliche Ursachen.

michael-calvin 7. Nov 2002 11:06

Vielen Dank - weitere Fragen
 
Hallo Daniel und Chris,

vielen Dank für Eure Antworten.

Ich habe in die ole2.pas und in die SDK-Seite reingeschaut.

Mir ist aber noch nicht klar geworden WIE genau man die Funktion
jetzt aufruft.

Könnt Ihr mir Beispiele posten?

Vielen Dank schon im Voraus

Gruß Michael

Christian Seehase 7. Nov 2002 11:45

Moin Michael,

in der Unit des Hauptformulares

Delphi-Quellcode:
uses
   ....
  ,ole2;
und dann unten:

Delphi-Quellcode:
initialization
begin
  CoInitialize(nil);
end;
Delphi-Quellcode:
finalization
begin
  CoUninitialize;
end;

michael-calvin 7. Nov 2002 20:46

hab was gutes dazu gefunden ! http://www.devexpress.com/prod
 
How do I eliminate the "CoInitialize has not been called" error?

COM libraries can be picky about when CoInitialize is called. In order to guarantee it is initialized at the proper time, use the following unit (save it as ComInit.pas):
Delphi-Quellcode:
unit ComInit;

interface

uses
  ActiveX;

implementation

initialization
  CoInitializeEx(nil,COINIT_MULTITHREADED);
finalization
  CoUninitialize;
end.
Make sure this is the first unit listed in the “uses” statement of your .DPR file. For example:
Delphi-Quellcode:
uses
  ComInit in 'ComInit.pas',
  WebBroker,
  ApacheApp,
  dMain in 'dMain.pas' {dmMain: TcxWebHomeDataModule},
  wMain in 'wMain.pas' {wpmMain: TcxWebPageModule} {*.html};
http://www.devexpress.com/products/vcl/ewf/faq.asp
[edit=FuckRacism]Code Syntax eingefügt; das geht mit [*code] [*/code] halt ohne den *[/edit]

sieppl 24. Aug 2004 15:11

Re: EAccessViolation mögliche Ursachen
 
Ich habe folgendes Problem in einem Thread:

Delphi-Quellcode:
begin
  if(CoInitializeEx(nil,COINIT_MULTITHREADED) = S_OK) then
    try
    ... //gekürzt
          end;
         Allocator.Free(PIDL);
        end;
      end;
    end;
  finally
    CoUnInitialize;
  end;
end;
Der 1. Thread läuft sauber durch und beim 2. bekomme ich dann die zitiere EAccessViolation.
Aber beim Ausführen von ConUnInitialize.

sieppl 24. Aug 2004 16:24

Re: EAccessViolation mögliche Ursachen
 
Kann es sein, dass ich CoInitialize und UnCoInitialize NICHT im Thread machen darf, da diese Aktionen sich sonst überschneiden und gegenseitig beeinflussen?
Ich habe die beiden Elemente jetzt in die Hauptschleife des Programms gepackt und es funktioniert wunderbar.
1. Kein Meckern im Thread das kein CoInitialize durchgeführt wurde.
2. Keine EAccessViolation bei Aufruf von UnCoInitialize.

Kann das einer bestätigen bitte?

Gibt es denn Befehle, die überprüfen können, ob ich schon initialisiert oder unitialisiert habe?
Ich brauche die COM-OBjects nur im Thread, dass ist ein bisschen Holzhammer-Methode die Hauptschleife mit den Befehlen einzuschließen..


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:54 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