Использование .NET dll через QT

#c# #c #.net #qt #dll

#c# #c #.net #qt #dll

Вопрос:

Я вряд ли пытаюсь использовать DLL-файл Laser Control на основе .NET в QT. Я зарегистрировал файл dll на сервере, создал файл tlb и импортировал его с помощью команды using

   #import "Litron.Control.CWLasers.tlb" no_namespace named_guids
 

после этого я использовал эту команду

 struct cwDiodeLaserPIV;
cwDiodeLaserPIV Laser=NULL;
CoInitialize(NULL);
HRESULT hr = CoCreateInstance(CLSID_cwDiodeLaserPIV, NULL, CLSCTX_INPROC_SERVER, IID__cwDiodeLaserPIV, reinterpret_cast<void*>(amp;Laser));
 

* Я добавил заголовочный файл ActiveQt также для использования CoCreateInstance

когда я проверяю, работает ли этот код с этим,

 if(SUCCEEDED(hr))
{ qDebug()<<"Calling dll is succeded"; }
else
{ qDebug()<<"Calling dll is failed"; }
 

Появляется сообщение «Сбой при вызове dll».
Но, когда я использую тот же код в Visual Studio C , появляется сообщение «Вызов dll завершен».
кроме того, даже вызов dll завершен успешно, я не смог вызвать функцию dll в VS.

Вот несколько вопросов.

Я использовал структуру cwDiodeLaserPIV. потому что в файле tlh cwDiodeLaserPIV объявляется с помощью команды struct . но на самом деле, когда я вижу внутреннюю часть dll, cwDiodeLaserPIV был объявлен с помощью class command . Почему это происходит? Могу ли я использовать его с объявлением структуры?

Когда я записывал код в QT, CLSID_ и IID_ части, не было каталога, который автоматически подключался. С другой стороны, в VS, CLSID_cwDiodeLaserPIV и IID__cwDiodeLaserPIV автоматически обнаруживаются VS. Повторюсь, в QT, CLSID_cwDiodeLaserPIV и IID__cwDiodeLaserPIV не найдены в списке каталогов, которые автоматически подключаются, когда я записываю CLSID_ или IID_. Почему это происходит? Не могу ли я использовать этот способ в QT?

Я ссылался https://forum.qt.io/topic/108642/how-to-include-a-com-tlb-library-in-my-c-project/2 и создал cpp и заголовочный файл с помощью dumpcpp. но, похоже, в нем недостаточно функций.

Я такой ванильный в QT и программировании. Итак, пример кода был бы очень полезен, большое спасибо…

Ответ №1:

CoCreateInstance это признак того, что вы используете COM. Это технология, которая позволяет вызывать код C с других языков и наоборот. То struct cwDiodeLaserPIV; , что вы видите в .tlh , представляет собой C представление интерфейса COM-объекта. На других языках могут использоваться другие представления. DLL может быть написана, например, на C #, в котором может использоваться ключевое class слово. COM — это связующий слой, который скрывает реализацию, но вам, вероятно, нужен второй уровень абстракции. Чистый COM — это сложно

Найденная вами ссылка описывает dumpcpp инструмент, который является альтернативой #import инструкции. Оба способа упрощают использование COM, но они действительно работают по-разному. dumpcpp знает, что он может использовать функциональность библиотеки Qt в своей реализации.

Вы не можете свободно смешивать подход Qt dumpcpp и подход Visual Studio #import . Если вы используете dumpcpp , вы должны использовать тип интерфейса, который он генерирует.