Во-первых, всех с наступающим Новым годом, надеюсь, у вас все хорошо!
Я работаю над проектом C++, в котором мне нужно вызвать DLL C#, созданную после первого ответа этот пост. Когда у меня есть DLL, мне нужно вызвать ее из Qt, поэтому с помощью dumpcpp и файла .tlb, сгенерированного regasm, мне удалось получить файл . cpp и .h, чтобы использовать мои классы. Для справки: пространство имен классов — Wrapper, а основной класс — Device с идентификатором {DD4A4896-C105-4C60-839B-B18C99C8FE15}< /эм>.
Когда у меня есть сгенерированные файлы для использования DLL, при попытке создать экземпляр Wrapper::Device в Qt я получаю следующую ошибку:
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}
, что, насколько я знаю, является правильным маршрутом для этих guids и указывает на правильную DLL.
Я думаю, что это может быть связано с какой-то проблемой ActiveQt, и, поскольку в ранее процитированном сообщении объяснялось, как использовать эту DLL из VS C++, я решил попробовать, используя это в качестве еще одной ссылки. Я закончил с этим кодом, который должен создать экземпляр моего объекта «Устройство».
#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 выдает исключение Класс не зарегистрирован и HR=80040154. Опять же, по словам редактора реестра, класс зарегистрирован, поэтому я не понимаю ошибки. Я также пытался использовать devPtr.CreateInstance("Wrapper.Device")
, devPtr.CreateInstance("Wrapper::Device")
или `devPtr.CreateInstance(Wrapper::CLSID_Device) в соответствии с опубликованными ссылками, но в этих случаях я получаю другое исключение с HR=800401f3 и сообщением Недопустимая строка класса.
Неважно, открыты ли VS или Qt Creator от имени администратора или нет, я получаю ту же ошибку. У меня закончились идеи, и мне действительно нужно иметь возможность использовать эту DLL из Qt, используя файлы, сгенерированные dumpcpp.
Кто-нибудь знает, что может происходить? Мне это кажется довольно странным.