Einbinden einer LIB

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Einbinden einer LIB

Beitrag von Wonderer »

Hallo,

ich habe den Auftrag mit XBase ein Programm zu schreiben für das Handling eines Barcode-Scanners.
Auf der Hersteller-Seite kann man ein Development-Kit herunterladen für C. Dabei sind einige .H Header-Files und .LIB Libraries.
Im Help-File zum DK steht folgendes:
Description
The AUDIO_PlayBeeper function is used to play sounds through the beeper at the current beeper volume.

Function Prototype
DWORD AUDIOAPI AUDIO_PlayBeeper(LPAUDIO_INFO lpAudioInfo
);

Parameters
lpAudioInfo

Pointer to AUDIO_INFO data structure.

Return Values
If the function succeeds, the return value is E_AUD_SUCCESS.
<snip...>

Header: audiocapi.h
Library: audioapi32.lib
Wenn ich jetzt die angegebene LIB mit 'pragma' einbinde bekomme ich eine Fehlermeldung wegen unbekanntem 'AUDIO_PlayBeeper'.
Ich habe mir mal mit 'dumpbin' die Library angeschaut und da steht bei dieser Funktion ein DLL-Name.

unter den 17 public symbols steht:
B12 AUDIO_PlayBeeper
B12 __imp_AUDIO_PlayBeeper
weiter unten dann:
Archive member name at B12: AUDIOAPIE32.DLL/ <snip..>
DLL name : AUDIOAPI32.DLL
Symbol name: AUDIO_PlayBeeper
Type: code
name type: name
hint: 4
name: AUDI_PlayBeeper
der Name der Funktion taucht dann ganz am Ende nochmal auf unter den 'exports'.

Der Support der Scanner versucht auch gerade mir zu helfen und schickte mir ein C++-Projekt zum testen.
Allerdings gibt es das Problem, dass ich VS c++ 2010 Express installiert habe und laut Dokumentation unterstützen diese
Express-Versionen irgendwas nicht (mobility development?) was man benötigt für die Verwendung des Kits.

Also erstmal die grundsätzliche Frage, ob es das so gibt, dass man eine Library einbindet und diese braucht widerum eine DLL
weil da externe Aufrufe deklariert sind?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Einbinden einer LIB

Beitrag von AUGE_OHR »

Wonderer hat geschrieben:
Description
The AUDIO_PlayBeeper function is used to play sounds through the beeper at the current beeper volume.

Function Prototype
DWORD AUDIOAPI AUDIO_PlayBeeper(LPAUDIO_INFO lpAudioInfo
);

Parameters
lpAudioInfo

Pointer to AUDIO_INFO data structure.

Return Values
If the function succeeds, the return value is E_AUD_SUCCESS.
<snip...>

Header: audiocapi.h
Library: audioapi32.lib
du benötigst einen "Pointer to AUDIO_INFO data structure".
nun ist AUDIO_INFO keine Windows Structure ... vermutlich ist die in der audiocapi.h definiert.

wenn es keine "einfache" Structure ist, was man mit BAP lösen könnte, dann schaue dir ot4xb unter http://www.xbwin.com von Pablo an.

p.s. gibt doch bitte einen Link von der LIB an.
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Einbinden einer LIB

Beitrag von Tom »

Die pragma-Direktive mit der Option "library" funktioniert meines Wissens nur für Xbase++-Bibliotheken.

Du musst Wrapperfunktionen (DLLFUNCTION oder DLLLoad(), DLLCall() und DLLUnload()) für die in der DLL enthaltenen Funktionen schreiben und die dann aufrufen.
Herzlich,
Tom
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: Einbinden einer LIB

Beitrag von Wonderer »

Danke für die schnellen Antworten! :)

@Auge_Ohr

Ja 'AUDIO_INFO' ist dort definiert:

Code: Alles auswählen

//Used by AUDIO_PlayBeep()
typedef struct tagAUDIO_INFO
{
    TCHAR	szSound[MAX_PATH];  // wav file name
    DWORD   dwDuration;          // Beep duration (in milliseconds)
    DWORD	dwFrequency;         // Frequency in Hz
} AUDIO_INFO;

typedef AUDIO_INFO FAR * LPAUDIO_INFO;
MAX_PATH steht in 'minwindef.h' -> #define mit Wert: 260

Ich denke ich könnte das eine Beispiel hier im Forum verwenden und eine String-Variable dafür nehmen
und dann die 3Bereiche 'herausschneiden' und entsprechend umwandeln. Eigentlich ja eher andersherrum.
PlayBeeper nimmt das als Parameter entgegen um zu wissen wie das Tonsignal sein soll, also werde ich
versuchen den String zusammenzusetzen und übergebe mit @.
Klingt jetzt erstmal einfacher als es vielleicht ist?
Muss mich da nochmal reindenken in das Binäre. Das hab ich zuletzt im Studium vor 8Jahren gelernt und
ausprobiert. Zum Glück ist DWORD soweit ich weiß 'unsigned'. :book:

@Tom

Das ist genau mein Problem. Mein allererster Ansatz war auch diese DLL zu nehmen und DllCall zu verwenden.
Nur ist nach der Installation der Treiber auf dem Testrechner diese 'AUDIOAPI32.DLL' nicht zu finden und bei
dem Development-Kit ist sie auch nicht dabei. :confused1:

Ich kann erstmal den direkten Link zum Hersteller mit dem EMDK for C v.2.8 hier teilen:
https://portal.motorolasolutions.com/Su ... nals_US-EN

Dort sind unter dem Verzeichnis ./Integrator/Device/... weitere Unterzeichnisse für Include&Lib..
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Einbinden einer LIB

Beitrag von Wolfgang Ciriack »

Was willst du denn überhaupt mit dem Scanner machen ?
Normalerweise schließt man den an und scannt, die Ergebnisse des Scans landen dann in dem Eingabefeld, wo man steht.
Oder willst du den Scanner über dein Programm konfigurieren ?
Viele Grüße
Wolfgang
Wonderer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 107
Registriert: Do, 06. Jul 2006 13:24

Re: Einbinden einer LIB

Beitrag von Wonderer »

Wolfgang Ciriack hat geschrieben:Was willst du denn überhaupt mit dem Scanner machen ?
Normalerweise schließt man den an und scannt, die Ergebnisse des Scans landen dann in dem Eingabefeld, wo man steht.
Oder willst du den Scanner über dein Programm konfigurieren ?
Hintergrund ist wie der Arbeitsablauf ist. Das Programm an sich mit dem Einscannen funktioniert schon.
Die Mitarbeiter im Lager würde jedoch gern zusätzlich am Scanner eine Rückmeldung bekommen wenn
ein Barcode von der Software entgegengenommen wurde. Im Moment gibt es ein Tonsignal am Scanner
wenn der Code decodiert und erfolgreich gesendet wurde. Dieses Signal würde ich dann ausschalten.
Nachdem dann im Programm der Barcode im Array gelandet ist mit entsprechendem Pakettyp, dann soll
ein Tonsignal vom XBase-Code aus getriggert werden (und beim Wechsel des Pakettyps durch Eingabe und
Senden eines Buchstabens vom Gerät aus zum PC ein abweichendes Tonsignal).

Ich hatte jetzt erst einmal einfach 'tone' verwendet. Jedoch steht der Rechner möglicherweise weiter
weg oder der Mitarbeiter scannt sogar die Pakete vor der Tür am LKW wenn die Lieferung kommt.
Dann hört derjenige natürlich das Signal der Rückmeldung direkt am PC nicht.

Habe jetzt noch das .NET und Java EMDK gefunden. Für das .NET Kit braucht man auch was anderes als
die Express-Versionen. Jetzt hoffe ich man kommt mit dem kostenfreien Paket von Oracle/Java und dem
EMDK da hin das Ton-Signal zu triggern. Dann schreib ich ein kleines Konsolen-Programm welches einfach
2 Parameter hat - Signalfrequenz und Anzahl und rufe das über die Shell vom XBase-Code auf.
Antworten