Aufgrund der Projektanforderungen habe ich Delphi verwendet, um eine DLL zu schreiben, die die Datenbank verbindet, um die Daten in die SQL -Datei zu exportieren, die die Tadoquery -Komponente verwendet.
Es gibt nur eine Exportmethode:
Funktion DataExport (Pfad, Ini_Path: pchar): Integer;
Nach dem Schreiben schrieb ich einen Test.exe mit Delphi zum Testen und stellte fest, dass er normal verwendet werden konnte.
Dann reichte er die DLL an seinen Kollegen und bat ihn, sie in Powerbuilder anzurufen. Nach der Einnahme stellte mein Kollege fest, dass nach dem Aufrufen von DataExportPB berichtet wurde, dass die Ziel -DLL nicht geöffnet werden kann. Ich denke, es könnte daran liegen, dass die auf beiden Seiten ausgeführten Umgebungen unterschiedlich sind, also habe ich den Test.exe kopiert und es ausprobiert. Seltsamerweise läuft test.exe gut.
Um festzustellen, wo das Problem wirklich auftritt, habe ich Python und C# erneut getestet.
Coinitialize () wird nicht genannt
Nach der Überprüfung der Informationen stellte ich fest, dass die Coinitialize -Methode von ActiveX vor der Verwendung aufgerufen werden muss, wenn die ADO -Komponente in der DLL von Delphi verwendet wird. Nachdem es das Problem kannte, wird es viel einfacher.
Ich dachte, Powerbuilder sollte in Ordnung sein, aber wer wusste, dass es das gleiche Problem sein würde. Ich kann es jetzt nicht herausfinden. Das CTYPES -Modul in Python verwendet die Aufrufmethode in C, und die Parameterübergabemethode sollte mit PowerBuilder übereinstimmen, aber warum ist es in PB immer noch nicht möglich? Mein Kollege hat mich gebeten, eine zusätzliche Ausgabemethode in DLL zu schreiben, um sie auszuprobieren.
Funktionstest: pchar;
Beginnen
Ergebnis: = 'Testzeichenfolge aus dem Test';
Ende;
Die Testmethode wurde in PB erfolgreich aufgerufen, und dann versuchte der Kollegen, DataExport erneut anzurufen, und es war erfolgreich! ! ? ? Warum? Diese Testmethode gibt nur eine feste Zeichenfolge aus. Ich bin wirklich verwirrt.
Zu diesem Zeitpunkt trat ein weiteres Problem auf.
Ich habe den Delphi -Code sorgfältig überprüft und herausgefunden, ob er nicht veröffentlicht wurde.
Funktion DataExport (Pfad, Ini_Path: pchar): Integer;
var
Abfrage: Tadoquery;
Beginnen
.........
Coinitialize ();
Abfrage: = tadoquery.create (nil);
.........
query.close;
query.free;
Couninitialize ();
.........
Ende;
Nichts falsch! In der Verzweiflung habe ich Coinitialize () und Couninitialize () in zwei unabhängige Methoden unterteilt.
Funktion Init: Ganzzahl;
Beginnen
versuchen
Coinitialize ();
Ergebnis: = 1;
außer
auf Ausnahme:
Ergebnis: = 0;
Ende;
Ende;
Funktion Uneinheit: Ganzzahl;
Beginnen
versuchen
Couninitialize ();
Ergebnis: = 1;
außer
auf Ausnahme:
Ergebnis: = 0;
Ende;
Ende;
Lassen Sie den Kollegen dann zuerst im Formularinitialisierungsereignis init aufrufen und schließen Sie dann das Ereignis, um Uneinheit aufzurufen. Problem gelöst. Alles ist normal.
Obwohl das Problem gelöst wurde, verstehe ich immer noch nicht, warum ich das mache.