![]() |
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 |
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 " ![]() Was die restlichen Fehler angeht, so kann ich Dir leider auch nicht weiterhelfen. :roll: Grüße, Daniel |
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:
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. |
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 |
Moin Michael,
in der Unit des Hauptformulares
Delphi-Quellcode:
und dann unten:
uses
.... ,ole2;
Delphi-Quellcode:
initialization
begin CoInitialize(nil); end;
Delphi-Quellcode:
finalization
begin CoUninitialize; end; |
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:
Make sure this is the first unit listed in the “uses” statement of your .DPR file. For example:
unit ComInit;
interface uses ActiveX; implementation initialization CoInitializeEx(nil,COINIT_MULTITHREADED); finalization CoUninitialize; end.
Delphi-Quellcode:
uses
ComInit in 'ComInit.pas', WebBroker, ApacheApp, dMain in 'dMain.pas' {dmMain: TcxWebHomeDataModule}, wMain in 'wMain.pas' {wpmMain: TcxWebPageModule} {*.html}; ![]() [edit=FuckRacism]Code Syntax eingefügt; das geht mit [*code] [*/code] halt ohne den *[/edit] |
Re: EAccessViolation mögliche Ursachen
Ich habe folgendes Problem in einem Thread:
Delphi-Quellcode:
Der 1. Thread läuft sauber durch und beim 2. bekomme ich dann die zitiere EAccessViolation.
begin
if(CoInitializeEx(nil,COINIT_MULTITHREADED) = S_OK) then try ... //gekürzt end; Allocator.Free(PIDL); end; end; end; finally CoUnInitialize; end; end; Aber beim Ausführen von ConUnInitialize. |
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 04:35 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