Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

1

10.09.2012, 13:19

Threading Model bei COM

Hallo Forum

Ich habe eine alte MFC Applikation die eine DLL benutzt.
Sowohl die EXE als auch die DLL benutzen das ADO COM-Objekt.
In beiden wird CoInitializeEx aufgerufen und ich erhalte immer den
Fehler dass das Threading Model bereits gesetzt ist und nicht mehr
verändert werden kann.

Die Frage die ich habe ist wo das Threading Model gesetzt werden kann ?
Muss ja schon gesetzt worden sein bevor meine EXE mit der DLL startet.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

10.09.2012, 13:29

CoInitializeEx() setzt das Threading Model. Das Problem ist, dass CoInitializeEx() zweimal aufgerufen wird.

Zitat von »MSDN«

CoInitializeEx must be called at least once, and is usually called only once, for each thread that uses the COM library. Multiple calls to CoInitializeEx by the same thread are allowed as long as they pass the same concurrency flag, but subsequent valid calls return S_FALSE.

Wenn du tatsächlich zwei Komponenten hast, die ein unterschiedliches Threading Model benötigen, hast du in der Tat ein Problem. Evtl. könntest du die beiden Komponenten in jeweils unterschiedlichen Threads betreiben?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (10.09.2012, 13:34)


stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

3

10.09.2012, 13:57

Ich benutze keine unterschiedlichen Threadmodelle.
Mein Problem ist das bereits beim ersten Aufruf von CoInitializeEx der Fehler kommt.
Daraus habe ich geschloßen dass das Threading Model bereits vor dem Start der EXE festgelegt worden ist.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.09.2012, 14:19

Was für einen "ersten Aufruf" meinst du genau? Wenn CoInitializeEx() fehlschlägt, dann kann es ja eigentlich nicht der erste Aufruf sein... ;)

Evtl. hast du irgendwelche globalen Variablen oder linkest irgendwelche statischen Libraries oder dlls, die eben CoInitializeEx() schon aufrufen!?

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

5

10.09.2012, 14:25

Was für einen "ersten Aufruf" meinst du genau? Wenn CoInitializeEx() fehlschlägt, dann kann es ja eigentlich nicht der erste Aufruf sein... ;)


Das ist ja gerade das Problem !
Meiner Meinung nach ist es der erste Aufruf von CoInitEx.
Mit COINIT_MULTITHREADED erhalte ich meinen Fehler dass das ein bereits gesetztes Thread Model nicht mehr geändert werden kann
und mit COINIT_APARTMENTTHREADED erhalte ich S_FALSE was bedeutet das Apartment Threading bereits (vor dem ersten Aufruf) gesetzt ist.

Daraus resultierte meine Frage ob es neben CoInitEx noch eine Möglichkeit gibt das Threading Model festzulegen.
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

10.09.2012, 14:33

Daraus resultierte meine Frage ob es neben CoInitEx noch eine Möglichkeit gibt das Threading Model festzulegen.

Nicht dass ich wüsste. Vermutlich setzt eben irgendeine von dir verwendete dll bereits das Threading Model...

stef

Treue Seele

  • »stef« ist der Autor dieses Themas

Beiträge: 246

Wohnort: Kassel

Beruf: Softwareentwickler

  • Private Nachricht senden

7

10.09.2012, 14:41

Mal eine andere Frage ...

Wenn meine EXE und meine DLL CoInitEx aufrufen, wie ist dann die Reihenfolge ?
Erst CoInitEx der EXE oder erst CoInitEx der DLL ?
"In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg." — Bjarne Stroustrup.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

10.09.2012, 14:43

Hängt davon ab, wie und wo genau ruft deine dll denn CoInitializeEx() auf? Verwendest du load-time oder run-time dynamic linking?

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

9

10.09.2012, 14:59

Beachte vor allem diesen Ausschnitt der MSDN:

Zitat von »MSDN«

Because there is no way to control the order in which in-process servers are loaded or unloaded, do not call CoInitialize, CoInitializeEx, or CoUninitialize from the DllMain function.

Ich vermute, dass mindestens eine deiner gelinkten Dlls sich nicht daran hält.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

10.09.2012, 15:01

Jap, genau darauf wollt ich auch hinaus. CoInitialize(Ex) in DllMain aufzurufen, gehört zu den Dingen, die man auf keinen Fall tun sollte, auch wenn du gerade Glück hast und es in deinem Fall zufälligerweise zu funktionieren scheint... ;)

Werbeanzeige