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 ();

и выполняться такое дело не хочет (компилируется, но на выполнение падает); и так с любыми функциями.
Собственно вопрос: так как правильно реализовать работу с функциями драйвера? В чем я не прав? Какие еще можно применить способы?
  • Вопрос задан
  • 1078 просмотров
Решения вопроса 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 гадание на кофейной гуще.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы