新年明けましておめでとうございます。お元気でお過ごしください。
この投稿の最初の回答に従って作成した C# DLL を呼び出す必要がある C++ プロジェクトに取り組んでいます。DLL を取得したら、それを Qt から呼び出す必要があるため、dumpcppとregasm によって生成された.tlbファイルを使用して、クラスを使用するための.cppおよび.hファイルを取得することができました。参考までに、クラスの名前空間はWrapperで、メイン クラスはGUID {DD4A4896-C105-4C60-839B-B18C99C8FE15}を持つDeviceです。
DLLを使用するファイルを生成した後、Qt でWrapper:: Deviceインスタンスを作成しようとすると、次のエラーが発生します。
QAxBase::setControl: requested control {dd4a4896-c105-4c60-839b-b18c99c8fe15} could not be instantiated
QAxBase::qt_metacall: Object is not initialized, or initialization failed
それ以上の情報は得られないので、GUID がシステム レジストリに保存されているかどうかを確認しようとしました (以前に引用した投稿で説明されている regasm コマンドを使用しましたが、成功したと言われましたが、わかりません)。レジストリ エディターを開いて Guid を検索すると、次の場所に存在することComputer\HKEY_CLASSES_ROOT\WOW6432Node\CLSID\{DD4A4896-C105-4C60-839B-B18C99C8FE15}
がわかりました。これは、私の知る限り、これらの GUID の正しいルートであり、正しい DLL を指しています。
ある種の ActiveQt の問題が原因である可能性がありますが、以前に引用した投稿で VS C++ からその DLL を使用する方法が説明されていたので、これを別のリファレンスとして使用して試してみることにしました。このコードは、Device オブジェクトのインスタンスを作成することになっています。
#include <iostream>
#include <atlstr.h>
#import "C:\Users\javie\Documents\Wrapper\Wrapper\bin\x86\Release\netstandard2.0\Wrapper.tlb" named_guids raw_interfaces_only
inline void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); };
int main()
{
try
{
TESTHR(CoInitialize(0));
Wrapper::IDevicePtr devPtr = nullptr;
TESTHR(devPtr.CreateInstance("{DD4A4896-C105-4c60-839B-B18C99C8FE15}"));
}
catch (const _com_error& e)
{
CStringW out;
out.Format(L"Exception occurred. HR = %lx, error = %s", e.Error(), e.ErrorMessage());
MessageBoxW(NULL, out, L"Error", MB_OK);
}
CoUninitialize();// Uninitialize COM
std::cout << "Hello World!\n";
}
ただし、これも機能しません。createInstance メソッドはClass not registeredとHR=80040154の例外をスローします。繰り返しますが、レジストリ エディターによると、クラスが登録されているため、エラーがわかりません。devPtr.CreateInstance("Wrapper.Device")
投稿したリンクが示唆するように、devPtr.CreateInstance("Wrapper::Device")
または `devPtr.CreateInstance("Wrapper::CLSID_Device")も試しましたが、その場合、 HR=800401f3とメッセージInvalid class stringで別の例外が発生します。
VS または Qt Creator が管理者として開かれているかどうかは関係ありません。まったく同じエラーが発生します。アイデアが尽きたので、dumpcpp によって生成されたファイルを使用して Qt からその DLL を使用できるようにする必要があります。
何が起こっているのか知っている人はいますか?私にはかなり奇妙に感じます。