Задать вопрос

C++, Qt, как правильно применять функции драйвера (dll)?

Приветствую всех. Заранее извиняюсь, но вопрос в стиле "покажите пожалуйста как сделать шобвсебылокруто".
Имеется драйвер для работы с устройством через COM-port (передача идет через FTDI) (драйвер работоспособен и тесты пашут) с именем "MifareDrv.dll" и именем объекта AddIn.MifareDrv . К слову даже есть пример подключения драйвера на делфи через OleControl:
uses MifareLib_TLB;
var
 Driver: TMifareDrv;
begin
 Driver := TMifareDrv.Create(nil);
 Driver.Beep;
end;

(есть даже на 1С, но я думаю он тут не нужен)
При реализации на Qt пошел через QLibrary. метод load подтверждает, что драйвер загружается.
Потом я решил проверить одну из функций следующим образом.
typedef void (*Connect) (); 
Connect con = (Connect)mylib.resolve ("Beep");
con ();

и выполняться такое дело не хочет (компилируется, но на выполнение падает); и так с любыми функциями.
Собственно вопрос: так как правильно реализовать работу с функциями драйвера? В чем я не прав? Какие еще можно применить способы?
  • Вопрос задан
  • 1092 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Psy_Duck
@Psy_Duck Автор вопроса
В итоге все-таки решил все
В моей случае вот верный код на Visual C++
// ConsoleApplication5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include "Objbase.h"
#import "MifareDrv.tlb" rename_namespace("mifare") 
CLSID clsid;
mifare::IMifareDrv ;
IDispatch *pWApp;
mifare::IMifareDrv *pMiDrv;
int _tmain(int argc, _TCHAR* argv[])
{
	HRESULT hr = CLSIDFromProgID(L"Addin.MifareDrv", &clsid);
	if (SUCCEEDED(hr))
	{
		LPOLESTR tmpbuf;
		StringFromCLSID(clsid, &tmpbuf);
		CoInitializeEx(NULL, COINIT_MULTITHREADED); // инициализация COM для ридеров
		hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void **)&pWApp);
		hr = pWApp->QueryInterface(__uuidof(mifare::IMifareDrv), (void **)&pMiDrv);
		pMiDrv->PortNumber = 4;
		pMiDrv->Connect();
		pMiDrv->BeepTone = 1;
		pMiDrv->PcdBeep();
	}
		return 0;
}


А вот код на Qt
#include <QApplication>
#include <QAxWidget>
QAxWidget *drvFR;
#define CLSID_DrvFR "{450E3DC0-5370-4007-BD5F-90827EC2C2D6}" // это GUID для объекта драйвера (у меня он звался Addin.MifareDrv). GUID вытащил из регистра 
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
drvFR = new QAxWidget();
drvFR->setControl(CLSID_DrvFR);
drvFR->dynamicCall("FindDevice()");
drvFR->dynamicCall("Connect()");
drvFR->setProperty("BeepTone", 1);
drvFR->dynamicCall("PcdBeep()");
....
и дописать в .pro write QT += axcontainer.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Походу с драйвером надо работать как с COM объектом doc.qt.io/qt-4.8/activeqt-container.html
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
Раз оно DLL - оно наверняка имеет экспорты. Соответственно, LoadLibrary + GetProcAddress наверняка смогут сделать то же самое, что вы пытаетесь сделать через приведенный вами код. И в случае ошибок GetLastError покажет что не так. Но вообще без самой DLL гадание на кофейной гуще.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы