#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
, вы должны использовать тип интерфейса, который он генерирует.