プロジェクトのニーズにより、Delphiを使用して、データベースを接続するDLLを作成して、データをタドキュリーコンポーネントを使用するSQLファイルにエクスポートしました。
エクスポート方法は1つだけです。
関数DataExport(PATH、INI_PATH:PCHAR):整数;
執筆後、私はテストのためにDelphiを使用してTest.exeを書きましたが、それは正常に使用できることがわかりました。
それから彼は同僚にDLLを渡し、PowerBuilderでそれを呼ぶように頼みました。私の同僚は、それを服用した後、DataExportPBが呼び出されると、ターゲットDLLを開くことができないことが報告されていることがわかりました。両側で実行されている環境が異なるためだと思うので、test.exeをコピーして試してみました。奇妙なことに、test.exeは正常に実行されます。
問題が実際に発生する場所を判断するために、PythonとC#を使用してC#以下に問題はありませんでしたが、Pythonはエラーを報告しました。
Coinitialize()は呼び出されません
情報を確認した後、ADOコンポーネントがDelphiのDLLで使用されている場合、使用前にActiveXのCoinitializeメソッドを呼び出す必要があることがわかりました。問題を知った後、ソースコードでタドキュリーを作成する前に、Coinitialize()が呼び出され、Pythonコールが成功します。
PowerBuilderは大丈夫だと思ったが、それが同じ問題になると知っていた。私は今それを理解することができません。 PythonのCTYPESモジュールはCでコールメソッドを使用し、パラメーターの通過方法はPowerBuilderと同じである必要がありますが、PBでまだ不可能なのはなぜですか?私の同僚は、DLLに追加の出力方法を書くように頼みました。
機能テスト:PCHAR;
始める
結果:= 'テストからのテスト文字列';
終わり;
テスト方法はPBで正常に呼び出され、その後、同僚はDataExportに再び電話をかけようとしましたが、成功しました! ! ? ?なぜ?このテスト方法は、固定された文字列を出力するだけです。私は本当に困惑しています。
しかし、この時点で別の問題が発生しました。
Delphiコードを慎重に確認し、次のようにフィギュアを使用していることがわかりました。
関数DataExport(PATH、INI_PATH:PCHAR):整数;
var
クエリ:タドキュリー;
始める
.........
coinitialize();
クエリ:= tadoquery.create(nil);
.........
query.close;
query.free;
couninitialize();
.........
終わり;
何も悪いことはありません!絶望的に、私はcoinitialize()とcoulinitialize()を2つの独立した方法に分割しました。
関数init:整数;
始める
試す
coinitialize();
結果:= 1;
を除外する
例外:
結果:= 0;
終わり;
終わり;
function uninit:整数;
始める
試す
couninitialize();
結果:= 1;
を除外する
例外:
結果:= 0;
終わり;
終わり;
次に、フォーム初期化イベントで最初にINITを呼び出してから、イベントを閉じてUNINITを呼び出します。問題が解決しました。すべてが正常です。
問題は解決されましたが、なぜ私がこれをするのかまだわかりません。