Aus externe Dll - Globale Variables / ReceiveData Retrun



  • Hallo,

    Kurz Info:

    Ich soll ein fremde dll ohne .h Datei (fehlt aber pdf vorhanden mit funktionbeschreibung) in mein c++ proramm implementieren die mit ein Gerät über RS232 komuniziert. Bis jetzt habe ich eine classe geschrieben die mir die Standard funktionen implementiert (mit __stdcall / GetProcAddress). Soweit so gut z.b wie DllComOpen, DllComClose, DllSendAsciiString usw funktioniert.

    Problem DllReceiveData: 😕 ich weiss nicht wie an den Daten ran kommen soll

    hier die funktion wie in der PDF beschrieben ist.

    DllReceiveData
    [Summary] Acquisition of data received
    
    [Function] BOOL DllReceiveData( BYTE* pbyBuffer, DWORD* pdwLength )
    
    [Argument] BYTE* pbyBuffer; Data received
               DWORD* pdwLength; No. of data (excepting NUL)
    
    [Return value] TRUE: Normal completion, FALSE: Irregular completion
    
    [Description] Obtains data of a receiving buffer. NUL is added to the end of data (for both ASCII and binary). However, pdwLength returns the value without NUL.When the return value is FALSE, verify the content of irregularities using the function of DllGetFatalError.DllGetWarningError.
    Perform processing again after resetting an irregular state using the function of DllComReset.
    

    Bin über jeder hilfe dankbar. IDE / Devcpp



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Und was ist jetzt Dein Problem? Ist doch alles beschrieben, oder?



  • Ganz einfach ich weiss nicht wie ich an die Date kommen soll.

    BOOL DllReceiveData( BYTE* pbyBuffer, DWORD* pdwLength )
    

    wie geht man sowas an? DllSendAsciiString war ja einfach.
    Aber keine Ahnung wie ich das aufbauen soll damit ich die Daten bekomme. Ich verstehe nicht wie ich da die länge angeben soll weiss ja nicht was vorher von dem gerät ja gesendet wird. 🙄 und BYTE als referenz angeben oder wie bekomme ich die Daten? 😕

    Kann mir denn da keinder da weiter helfen?



  • Du reservierst sowohl für pbyBuffer als auch pdwLength Speicherplatz. Wieviel Platz für den Buffer benötigt wird, geht aus deinem Auszug nicht hervor.

    BYTE myBuffer[MAXIMALE_LAENGE]; // die maximale Länge sagt dir das PDF
    DWORD myBufferLength; // hier kommt die Anzahl der gelesenen Bytes rein
    
    if (DllReceiveData(&myBuffer, &myBufferLength){
        do_something_with(&myBuffer, &myBufferLength); // in myBuffer sind jetzt die Daten, und zwar myBufferLength Bytes
    } else {
        // hat nicht funktioniert
    }
    

    Bitte sehr.



  • Danke schön.
    werde ich sofort ausprobieren. 🙂



  • shit jetzt kommt Compiler fehler:

    Code

    BYTE myBuffer[48]; // die maximale Länge sagt dir das PDF
         DWORD myBufferLength; // hier kommt die Anzahl der gelesenen Bytes rein
    
         if (DllReceiveData(&myBuffer, &myBufferLength)){
            do_something_with(&myBuffer, &myBufferLength); // in myBuffer sind jetzt die Daten, und zwar myBufferLength Bytes
            } else {
            cout << "hat nicht funktioniert" << endl;
           }
    

    Compiler:

    97 I:\Dev-Cpp\TestCom4\SXSerial.cpp cannot convert `BYTE (*)[48]' to `BYTE*' in argument passing
    

    THX



  • Dann probiers mit

    BYTE* myBuffer = new BYTE[HIER_DIE_GROESSE_EINTRAGEN];
    
    /* dein Code */
    
    delete[] myBuffer; // nicht vergessen
    


  • Mach das "&"-Zeichen vor dem "myBuffer" weg...

    if (DllReceiveData(myBuffer, &myBufferLength){ 
        do_something_with(&myBuffer, &myBufferLength); // in myBuffer sind jetzt die Daten, und zwar myBufferLength Bytes 
    } else { 
        // hat nicht funktioniert 
    }
    


  • Ja so muß das sein Jochen. 🕶

    So funktioniert einwandfrei:

    if (DllReceiveData(myBuffer, &myBufferLength)){
            parseData(myBuffer, &myBufferLength); 
            }
    

    Vielen Dank an euch!!!! 😃 👍 👍

    Aber jetzt hätte ich gerne noch ne kleine frage und zwar:
    In der pdf-dll steht
    "DLL global variables"

    Beispiel:

    csComInfo
             [Summary] System information
             [Declaration] COMINFO csComInfo;
             [Description] Retains necessary information when the port opens.
             [Structure] typedef struct{
             BOOL fConnect; Port connection completion flag
                  (FALSE: Incomplete, TRUE: Completed)
             HWND hWnd; Owner window handle
             HANDLE hCom; Communication handle
             UINT uiTimerNo; Timer No.
             UINT uiTimerWait; Timer interrupt interval
             BOOL fTimerSw; Timer operating status (FALSE: OFF, TRUE: ON)
             DWORD dwPort; Port (1: COM1, 2: COM2)
             BYTE byDataBit; Data bit (7: 7 bits, 8: 8 bits)
             BYTE byStopBit; Stop bit (0: 1 bit, 1: 1.5 bits, 2: 2 bits)
             BYTE byParity; Parity (0: None, 1: Odd number, 2: Even number)
             DWORD dwBaudRate; Baud rate (300 - 38400)
             OVERLAPPED osWrite; API information
             OVERLAPPED osRead; API information
             HANDLE hFncThread; API information
             DWORD dwThreadID; API information
    } COMINFO, NEAR *NPCOMINFO;
    

    kann man das auch abfragen???? z.B Referenz oder Pointer da drauf???



  • Les doch die Doku ob es da eine Funktion gibt die Dir ein "COMINFO" zurückliefert!



  • Habe ich schon aber leider hat die dll so eine funktion nicht.
    Da steht nur

    2. DLL global variables

    Variable Table
    
    csComInfo    System information
    csFatalErr   Fatal error information 
    csWarningErr Warning error information
    
    usw..
    

    🙄



  • Das müsste auch mit GetProcAddress gehen...
    Schau mal mit www.dependencywalker.com nach, wie die Namen in der DLL wirklich heissen...


Anmelden zum Antworten