Seite 1 von 1
[gelöst]QLibrary und CT API
Verfasst: 28. November 2005 22:51
von BartSimpson
Hallo ich wollte QLibrary benutzte, damit ich die CT Lib nicht linken muss. Das hat den Zweck das man das Programm nicht für jeden Kartenleser neu compiliert werden muss. Hat jemand eine Idee wie man das ansetzen muss?
Die 3 Funktionen aus der Lib sehen so aus:
Code: Alles auswählen
typedef unsigned char IU8;
typedef unsigned short IU16;
typedef signed char IS8;
IS8 CT_init( IU16 ctn, IU16 pn );
IS8 CT_data( IU16 ctn, IU8 *dad, IU8 *sad, IU16 lenc, IU8 *command, IU16 *lenr, IU8 *response );
IS8 CT_close( IU16 ctn );
Verfasst: 29. November 2005 07:42
von Christian81
Hier ein Beispiel aus qt3/free wie ich es gelöst habe:
Code: Alles auswählen
/* needed for dynamic loading ... */
static BOOL ( WINAPI * qtSLWA ) (
HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags ) = NULL;
/* see SIM-Icq -> plugins -> transparent for original source */
void QWidget::setWindowOpacity( double opacity )
{
/* imho this only works for toplevel / getMainWindow() */
if ( !isTopLevel() )
return ;
/* This is only supported on w2k and higher - so load it on runtime */
if ( !qtSLWA )
( DWORD& ) qtSLWA = ( DWORD ) QLibrary::resolve( "user32.dll", "SetLayeredWindowAttributes" );
/* not found -> win9x ? */
if ( !qtSLWA )
return ;
....
(*qtSLWA)(winId(), 0, (int)(opacity * 255), LWA_ALPHA);
....
}
Aber warum willst Du das überhaupt so machen? Ist es eine optionale Bibliothek? Wenn nicht finde ich sollte man sie beim Linken mit angeben - das ist wesentlich weniger Arbeit und man wird beim Programmstart darauf hingewiesen dass diese Dll fehlt...
Verfasst: 29. November 2005 09:20
von BartSimpson
Das ist die Treiber lib für den Kartenleser die ist zwar genormt. Von den Funktionen her. Aber jeder Leser hat natürlich einen andere lib. Nur die Aufrufe sind gleich. Im Moment muss ich das Programm für jeden Leser neu übersetzen:(
In deinem Beispiel braucht die Funktion qtSLWA die Parameter HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags und liefert bool zurück? Oder nicht?
Verfasst: 29. November 2005 09:24
von Christian81
Ok, dann ist das dynamische Laden zur Laufzeit natürlich gut.
Man sollte am Ende nicht vergessen die Dll/Lib mit QLibrary::unload() wieder freizugeben.
Verfasst: 29. November 2005 09:29
von BartSimpson
Laut doku muss man unload nicht ausführen.
Unloads the library and returns true if the library could be unloaded; otherwise returns false.
This happens automatically on application termination, so you shouldn't normally need to call this function.
Verfasst: 29. November 2005 09:39
von Christian81
ok, der Destruktor macht das auch

man könnte das ganze noch in eine Klasse packen damit es schöner aussieht
Code: Alles auswählen
class DllLoader :public QLibrary {
protected:
bool ( qtFunc1 ) ( void ); // oder wieauchmmer die Parameter sind
...
public:
DllLoader(QString &fnDll) : m_fnDll(fnDll) {}
// die 3 funktionen aus der Dll
bool funktion1( Parameter );
...
}
DllLoader::funktion1( Parameter )
{
if ( !qtFunc1 ) {
if ( !isLoaded ) {
if ( !load (m_fnDll) )
return false;
}
qtFunc1 = resolve( m_fnDll, "funktion1" );
}
if ( !qtFunc1 )
return false;
qtFunc1( Parameter )
}
Wobei das Laden der Dll in die überschriebene DllLoader::resolve mit rein kann um doppelten Code zu vermeiden.
Verfasst: 29. November 2005 09:54
von BartSimpson
Nagut dann werde ich das mal versuchen ob das mit dem laden so geht:)
Verfasst: 29. November 2005 12:06
von BartSimpson
Ja es klappt prima. Unter Linux:) (Da dort der Name de Lib immer gleich ist:)) Nur unter Windows heist die Datei bei jedem Leser anders. Mal schauen, ob man in der Registry was findet:) Denn das würde es dem Nutzer unter Windows wesentlich leichter machen. Denn wer weis schon wie die Lib heist:(