Frage

Das Ich denke an meine Verwendung des nlog C ++ API (und meine Frage auf dem nlog Forum Zusammenhang ist hier ); der Zweck meiner diese Frage hier zu fragen ist, ein breiteres Publikum zu meinem Problem zu bekommen und vielleicht auch einige allgemeinere Ideen hinter dem VB6 IDE Scheitern zu bauen in meinem speziellen Szenario zu erhalten.

Kurz gesagt, das Problem, das ich habe ist, dass ich Probleme Aufbau VB6 Komponenten bin, die nicht verwaltete C ++ Komponenten verweisen, die Anrufe der nlog C \ C ++ API (die in NLogC.DLL definiert ist). Die Build-Probleme werden nicht während der Kompilierung auftreten, treten sie, wenn das binäre gebaut wird, was mir zeigt, dass es irgendeine Art von Linker-Typ Problem? Sie wissen nicht genug darüber, wie VB6 Binärdateien sagen werden produziert. Die VB6 binäre erzeugt wird, aber es ist beschädigt und stürzt kurz nach dem es aufgerufen wird.

Hat jemand noch keine ähnlichen Erfahrungen mit VB6 (muss nicht nlog oder C ++ verwandt sein)?

edit: Danke für alle Antworten auf diesen eher obskuren Problem. Noch leider nicht voran; meine Erkenntnisse, seit ich gepostet:

  1. 'Tweaking' die Kompilierungsoptionen erscheint nicht in diesem Problem zu helfen.
  2. einen Verweis auf die nlog fähigen C ++ Komponente aus einem ‚leeren‘ VB6 Projekt Hinzufügen es nicht abstürzt oder seltsame Build Probleme verursachen. Es ist also kein ‚native‘ VB6 Problem, möglicherweise ein Problem mit der Interaktion zwischen nlog und den verschiedenen Komponenten und 3rd-Party-Bibliotheken, die von anderen referenzierten Komponenten verwendet?
  3. Wie für C ++ Aufrufkonventionen: der nlog-fähigen C ++ Komponente ist - soweit ich sehen kann - konform zu diesen Konventionen und arbeitet in der Tat gut, wenn so lange von VB6 verwiesen, da es keine nlog API-Aufrufe macht. Nicht sicher, ob die nlogc.DLL selbst VB6 kompatibel ist, aber ich hätte gedacht, dass das gleichgültig ist, da die API-Aufrufe aus dem C ++ Komponente hergestellt werden; VB6 sollten wissen, oder kümmern sich nicht über das, was die C ++ Komponente verweist (das ist so weit wie mein Verständnis auf diese geht ...)

edit2: Ich sollte auch beachten, dass die Fehlermeldung während des Build erhalten ist: „Fehler beim Laden Bitte beachten Sie‚xxx‘für Details“. Wenn ich die Log-Datei aufzurufen, alles, was es da drin ist: „Kann nicht die Kontrolle xxx laden“. Interessanterweise alle Verweise auf die jeweilige Steuer verschwinden aus diesem speziellen Projekt, was zu der Kompilierung Fehlern, wenn ich wieder zu bauen, um zu versuchen war.

War es hilfreich?

Lösung

, um das Problem habe NLog COM-Schnittstelle (NLog.ComInterop.DLL) von meinem nicht verwaltete C ++ Code. Nicht so einfach, wie die C \ C ++ API zu tun, aber zumindest ist es nicht meine VB6 Komponenten zum Absturz bringen.

Andere Tipps

Ich würde versuchen, in dem Projekt , Eigenschaften Menü Compile Platte gefunden, einige der Compile Optionen zwicken um zu sehen, ob sie irgendwelche zusätzlichen Hinweise auf ergeben, was nicht in Ordnung ist.

Wenn Sie zum Beispiel die ausführbare Datei zu p-Code statt nativen Code kompilieren lässt es noch beim Start abstürzen.

Welche Fehlermeldung erhalten Sie, wenn Sie Ihre kompilierte binäre laufen?

Ich bezweifle, dass der Compiler / Linker ist das Problem: Projektreferenzen in einem VB6 Projekt werden in die endgültige ausführbare Datei nicht verbunden. Ein Projekt in Bezug VB6 ist eigentlich ein Verweis auf eine COM-Typ-Bibliothek (die möglicherweise nicht in einem DLL oder anderem binärem Dateityp eingebettet werden). Projektreferenzen in erster Linie zwei Zwecken dienen:

  1. Die IDE-Extrakte geben Informationen aus den genannten Typ-Bibliotheken, die es zeigt dann im Objekt-Browser (und im Intellisense Drop-down)

  2. Bei der Kompilierung Zeit extrahiert der Compiler die Typinformationen in den genannten Bibliotheken gespeichert sind, einschließlich der CLSID jeder Klasse, die Sie instanziieren und bettet diese Daten in die ausführbare Datei. Auf diese Weise können Sie Ihre ausführbaren Instanzen von Klassen in den Bibliotheken enthalten sind, erstellen, die Sie verwiesen.

Beachten Sie, dass die kompilierte binäre nicht in den genannten Bibliotheken zu jedem Code nicht verknüpfen, und es ist nicht einmal die Dateinamen der referenzierten Bibliotheken enthält. Die endgültige ausführbare Datei enthält nur die CLSID und eine andere Art Informationen, die es COM-Objekte zur Laufzeit instanziiert werden muss.

Es ist viel wahrscheinlicher, dass das Problem mit NLog ist, oder mit, wie Sie es aus dem Code aufrufen, anstatt etwas in der VB6 Kompilierung schief gegangen.

Wenn Sie denken, es könnte ein Linker Problem sein, das sollte es die gleiche Weise abstürzen:

  1. Erstellen Sie ein neues Standard-Projekt (jeglicher Art)
  2. ein neues Modul hinzufügen und das „erklären“ -Aussagen hinein
  3. kopieren
  4. Compile

Wenn es nicht abstürzt es etwas anderes ist.

Es wäre eine genaue Beschreibung des Fehlers oder einen Screenshot helfen, was los ist.

Eine Sache zu prüfen ist, wo immer NLogC.DLL oder die C ++ DLL Sie gebaut haben die richtige Aufrufkonvention definiert. Grundsätzlich können Sie nicht haben die DLL-Funktion Namen verstümmelt oder etwas verwenden, aber die STDCALL Aufrufkonvention. Wenn der C ++ DLL nicht mit diesen beiden Dingen im Kopf erstellt worden ist, dann wird es scheitern mit VB6 zu arbeiten.

MSDN Artikel auf Aufrufkonvention.

„Kann nicht die Kontrolle xxx laden“ Fehler können durch .OCA Dateien verursacht werden, die aus einer anderen Version eines OCX erstellt wurden, als zur Zeit verwendet. Wenn das der Fall ist, hilft die .oca Dateien zu löschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top