Avatar billede heyn Nybegynder
03. april 2013 - 09:55 Der er 16 kommentarer og
1 løsning

DLLExport drivere betalingsterminaler Linux HJÆLP

Hej Eksperter

Jeg er helt lost

Jeg har ikke programmeret C++ i 10 år. siden har jeg holdt mig til PHP.

Nu har jeg pludselig fået en opgave hvor vi skal integrere dankort betalingsterminaler i de kasseapparater vi laver.

Jeg har heller aldrig beskæftiget mig særlig meget med Linux, men vores skal laves i Linux.

Først og fremmest var det nyt for mig at DLL - filer ikke er noget Windows specifikt, men at de bare ikke hedder .dll i Linux.

Fra producenten er der vedlagt filer til Windows og Linux. I Windows heder de flxdrv.dll og flxdrv.lib så jeg antager at filerne FlexDriver.a.3.3 og FlexDriver.so.3.3 er de tilsvarende. Desuden er der vedlagt en demo, men den er skrevet i C# som jeg heller ikke er kendt med.

Med løsningen følger der en .h fil. Det må jo så være denne jeg skal bruge til at udvikle min .cpp fil. Men jeg har store problemer med at tolke definitionerne i denne fil.

Især har jeg besvær med at forstå en betegnelse "DllExport".

Den fremgår på følgende måde:

#ifdef _WIN32
#define DllExport __declspec(dllexport)
#else
#define DllExport
#endif

...
...
...

/*
    Function:    flxOpen
                open session to terminal
                flxdrv.ini file used by function to determine open type.
    Input:        -
    Output:        -   
    Return:        - See CONNECT RETURN VALUES above
                OPEN_NO_RECEIPT - if open but terminal in no receipt state
                FAILURE            - not OK
                SUCCESS            - OK.
*/
DllExport int flxOpen(void);

Hvorfor er der ingen .cpp til disse funktioner? Har det noget med DLLExport at gøre?

Jeg håber nogen kan hjælpe mig lidt på vej, så jeg i det mindste kan komme i gang.

Venligst Christian
Avatar billede arne_v Ekspert
03. april 2013 - 13:29 #1
Dit program inkluderer .h filen og du kalder disse funktioner.

Leverandoeren har en .c eller .cpp fil og har compilet denne til .a/.so.

Du bygger dit program mod .a/.so.
Avatar billede heyn Nybegynder
03. april 2013 - 13:52 #2
.h filen includerer også nogle funktioner i stil med

    Function:    pcbPrintReceipt
                printReceipt prints a formatted receipt or report.

    Prototype:    int  printReceipt(unsigned int receipt_status, const char* cText);

som man kan vælge at inkludere.

Skal man forstå det således at jeg skal programmere en .cpp for disse funktioner, og at de funktioner med foranstående DLLExport allerede er compileret i .a/.so og at compileren så vil hente funktionerne derfra?
Avatar billede arne_v Ekspert
03. april 2013 - 13:56 #3
Du skal bare kalde de funktioner.

Linkeren inkluderer dem fra .a/.so.
Avatar billede heyn Nybegynder
03. april 2013 - 14:25 #4
Lad os se om jeg forstår det rigtigt.

Jeg laver altså en .cpp fil hvor der står noget i stil med

include flex.h

main(){

noget kode

int i = printReceipt(3, "en_tekst");

mere kode

}

int  function printReceipt(unsigned int receipt_status, const char* cText){
...
...
int j = flxOpen();
...
...
return EN_INT;
}

Så ved compileren at flxOpen() betyder at driveren FlexDriver.a.3.3 skal anvendes.

Men hvordan ved compileren så at den skal anvende flexDriver.a.3.3? (Hvis ovenstående altså er forstået rigtigt)
Avatar billede arne_v Ekspert
03. april 2013 - 14:33 #5
command line option til gcc
Avatar billede heyn Nybegynder
03. april 2013 - 15:08 #6
Men er det rigtigt forstået at dem med foranstående DLLExport kaldes i dll filerne mens de funktioner uden foranstående skal kodes af mig?
Avatar billede arne_v Ekspert
03. april 2013 - 16:00 #7
DLLExport eksporterer funktioner saa de er synlige i DLL paa Windows.

Jeg kan ikke forestille mig at du skal implementere nogle funktioner i din .h fil.

Uanset om det er DLL eksporterede eller ej.
Avatar billede heyn Nybegynder
03. april 2013 - 16:25 #8
Der er i .h filen en funktion

DllExport int flxGetID(void);

og dokumentationen skriver at den returnerer dankortterminalens id, som i vores tilfælde er 990620.

Hvis jeg nu vil teste om jeg kan få noget helt simpelt til at fungere i min flex.cpp fil som f.eks. at skrive id til terminalen så skrive

#include "flex.h"
#include <iostream>

main(
  cout flexGetID();
}

Er dette den rette måde, og hvordan skal jeg compile min fil.

P.s. Hvis jeg får får bare noget så simpelt til at fungere så er der virkelig hurra her på kontoret :)
Avatar billede arne_v Ekspert
03. april 2013 - 17:07 #9
#include <iostream>

using namespace std;

#include "flex.h"

int main()
{
  cout << flexGetID() << endl;
  return 0;
}
Avatar billede arne_v Ekspert
03. april 2013 - 17:07 #10
build command boer vaere i dokumentationen
Avatar billede arne_v Ekspert
03. april 2013 - 17:29 #11
typisk vil det vaere noget a la:

g++ foo.cpp bar.a -o foobar
Avatar billede heyn Nybegynder
04. april 2013 - 10:26 #12
Altså - Som jeg startede med - Det er lang tid siden jeg har rørt ved c++ og Linux. Det skal lige ind igen. Og jeg har ikke rørt Dynamic Libaries før.
Og hvad angår dokumentationen er den meget tynd. Den smule der findes er til Windows.
Så vidt jeg husker skal DLL filer føres ind i registreringsdatabasen i Windows, men hvordan man gør det i Linux ved jeg ikke.

Compileringen?

Jeg har søgt på nettet. Det har gjort mig om muligt endnu mere forvirret.

Jeg har altså mine filer FlexDriver.a.3.3 og FlexDriver.so.3.3, flex.h og nu min testGetTermID.cpp .

Som jeg forstår en vejledning på nettet skal jeg placere FlexDriver.a.3.3 og FlexDriver.so.3.3 i usr/lib/ . Hos mig ligger der også andre so filer der.

Så nævnes dette. Hvad gør det og oversættes det i mit tilfælde.
gcc -shared -Wl,-soname,your_soname \
    -o library_name file_list library_list

Så nævnes følgende. Jeg antager at libmystuff.so.1 er FlexDriver.so.3.3. Men resten forstår jeg ikke.
gcc -fPIC -g -c -Wall a.c
gcc -shared -Wl,-soname,libmystuff.so.1 \
    -o libmystuff.so.1.0.1 a.o -lc

Endelig nævnes det at jeg skal skrive følgende.

ldconfig -n directory_with_shared_libraries

Jeg antager at directory_with_shared_libraries er usr/lib/?
Er det dette der gør det samme som når en dll fil registreres i Widows?

Men hvor kommer DllExport ind?
Og hvor er min libmystuff.a.1?
Og hvor skal jeg placere min flex.h fil når jeg compiler?

Ja - Jeg er meget forvirret.
Min eneste glæde er at kortlæseren ikke blev registreret som en ukendt enhed, og at den bootede korrekt da jeg tilsluttede pci-kablet.

Kunne du give mig et hint til hvordan min g++ kommando(er) skal se ud? Hvis bare jeg får et lille program der kan få kortlæseren til så meget som at blinke er vi på rette vej. Så burde jeg kunne klare den.
Er der i øvrigt ikke noget med at man kan tilføje noget til g++ kommandoen så den giver en lidt uddybende fejlmelding?

Venligst Christian
Avatar billede arne_v Ekspert
04. april 2013 - 15:32 #13
Det er kun COM DLL'er som skal registreres i Windows ikke Win32 DLL'er.

Saa glem alt om det.
Avatar billede arne_v Ekspert
04. april 2013 - 15:32 #14
gcc -shared -Wl,-soname,your_soname \
    -o library_name file_list library_list

er hvis du skal lave din egen .so, saa glem ogsaa alt om det.
Avatar billede arne_v Ekspert
04. april 2013 - 15:36 #15
Som jeg skrev i #11:

g++ foo.cpp bar.a -o foobar

foo.cpp skal erstattes med testGetTermID.cpp

foobar bestemmer du selv hvad skal erstattes med maaske  testGetTermID gav god mening

bar.a kunne vaere FlexDriver.a.3.3 men jeg kan ikke vide det

og der skal muligvis ogsaa linkes med andet
Avatar billede heyn Nybegynder
09. april 2013 - 10:08 #16
Problemet blev løst med at lægge alle filer i mappen

/home/USER/dll/ og derefter køre

make

Så bliver programmet compilet.

og derefter skrive

export LD_LIBARY_PATH=/home/USER/dll

Desuden skal der være en del argumenter i gcc.

Så får jeg tilbagemeldinger fra library filen.

At jeg så ikke kan skabe forbindelse til min kortterminal er et helt andet problem af teknisk karakter som jeg må kaste mig over nu :)

Du fik mig meget på vej som en begynder. Tak for det. Smider du et svar?

Venlig hilsen Christian
Avatar billede arne_v Ekspert
09. april 2013 - 15:01 #17
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester