C++ dllからC#DLLのメソッドを呼び出すためにCOM相互運用機能を使用します。私には本質的にブラックボックスである別のアプリケーションからC++ dllが呼び出されます(例えば、私はそのコードを見ることができません)。DLLメソッドでのCOMインターフェイスポインタの作成は、あるアプリケーションから呼び出されたときに機能しますが、別のアプリケーションから呼び出されたときには機能しません。
このアプリケーションがC++ dllのメソッドを呼び出すと、ポインタを作成する/メソッドが失敗したこの時点でC#COMインタフェース、(エラーが記録されている)にメモリを割り当てる:
TJIntegration::ITJInterfacePtr tJPtr = NULL;
HRESULT hRes = tJPtr.CreateInstance(__uuidof(TJIntegration::TJInterface));
if (!(SUCCEEDED(hRes)))
{
LOG_ERROR << "Could not create pointer for TJInterface. Has the COM DLL been registered?";
}
しかし、私はまた、このDLLを呼び出し、テストアプリケーション、および方法を作成しましたこのポインタを作成することを含め、期待どおりに完全に実行されます。
私は(DLLが登録されている)と同じマシン上でこれらのアプリケーションをテストしていので、私は別から呼び出されたときの方法は、一つのアプリケーションから呼び出されたときに正しく機能しますが、この時点で失敗するだろう理由を理解できないのですか?
この質問はリンク先とどう違うのですか? – user463035818
ポインタを言うと、COMオブジェクト/関数でメモリを割り当てる際にクラッシュすることを意味しますか?または、呼び出し元のアプリケーションが単にメソッドを呼び出す*クラッシュしていますか?それとも、プログラムはクラッシュする前にCOMメソッドに入れますか?これは単に関数のパラメータに基づいたバグである可能性があるためです。 –
@ tobi303私がリンクしている質問は、別のマシンで使用されたときにクラッシュし、dllが登録されていないためでした。これは、同じマシン上の異なるアプリケーション(dllが登録されている場所)でdllを呼び出すときの動作が異なるようにするためです。 –