[gelöst]QLibrary und CT API

Alles rund um die Programmierung mit Qt
Antworten
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

[gelöst]QLibrary und CT API

Beitrag 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 );
Zuletzt geändert von BartSimpson am 16. Dezember 2005 10:28, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Nagut dann werde ich das mal versuchen ob das mit dem laden so geht:)
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag 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:(
Antworten