Einzelnen Beitrag anzeigen

Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#1

DLL - Probs mit Strings

  Alt 3. Okt 2011, 10:30
Moin zusammen !

Ich habe hier eine DLL, um DVB-Geräte abzufragen/zu steuern (von TechnoTrend, ttBdaDrvApi_Dll.dll).
Zu dieser DLL habe ich eine Source in C zur 'Ansprache'.

Die DLL lade ich dynamisch, was auch so weit mit den meisten Funktionen einwandfrei klappt.
Allerdings gibt es eine Func zum Auslesen von Gerätenamen/-Typen, mit der ich nicht klar komme - d.h. in den zurückgelieferten Strings eines Records lese ich nur 'dummes Zeug'. Das Funktions-Ergebnis ist ok, ich habe auch keine Fehler.

Deklarationen in C:
Code:
// Lists all possible frontend types.
typedef enum
{
    /// not set
    TYPE_FE_UNKNOWN = 0,
    /// DVB-C
    TYPE_FE_DVB_C,
    /// DVB-S
    TYPE_FE_DVB_S,
    /// DVB-S2
    TYPE_FE_DVB_S2,
    /// DVB-T
    TYPE_FE_DVB_T,
   /// ATSC
    TYPE_FE_ATSC,
    /// DSS
    TYPE_FE_DSS,
    /// DVB-C and DVB-T
    TYPE_FE_DVB_CT,
    /// TT-premium with Dual DVB-S2 and digital capture
    TYPE_FE_DVB_S2_PREM
} TYPE_FRONT_END;
...
///     Lists the bda filternames.
typedef struct
{
    char           szTunerFilterName[MAX_PATH];
    char           szTunerFilterName2[MAX_PATH];
    char           szCaptureFilterName[MAX_PATH];
    char           szAnlgTunerFilterName[MAX_PATH];
    char           szAnlgCaptureFilterName[MAX_PATH];
    char           szSTBCaptureFilterName[MAX_PATH];
    char           szProductName[MAX_PATH];
    TYPE_FRONT_END FeType;
} TS_FilterNames, *pTS_FilterNames;
...

// functions to get something from the driver
...
TTBDADRVAPI TYPE_RET_VAL bdaapiGetDevNameAndFEType(HANDLE hOpen, pTS_FilterNames FilterNames);
...
In Delphi hab ich das so umgesetzt:
Code:
...
type
  PTT_FilterNames = ^TT_FilterNames;
  TT_FilterNames = record //packed record
    TunerFilterName      : array[0..MAX_PATH] of char;
    TunerFilterName2      : array[0..MAX_PATH] of char;
    CaptureFilterName    : array[0..MAX_PATH] of char;
    AnlgTunerFilterName  : array[0..MAX_PATH] of char;
    AnlgCaptureFilterName : array[0..MAX_PATH] of char;
    STBCaptureFilterName : array[0..MAX_PATH] of char;
    ProductName          : array[0..MAX_PATH] of char;
    FeType               : word;
  end;
...
// als var in einer Klasse:
    _bdaapiGetDevNameAndFEType : function(TThwnd : HWND; var FilterNames : TT_FilterNames) : HRESULT; cdecl;
...
// Laden:
    @_bdaapiGetDevNameAndFEType := GetProcAddress(LibHdl, 'bdaapiGetDevNameAndFEType');
...
// Funktion ausführen
    if (_bdaapiGetDevNameAndFEType(Dev.DevHdl, Dev.FilterNames) = 0) then
    begin
      Log('--> TunerFilter: ' + strpas(Dev.FilterNames.TunerFilterName));
      Log('--> TunerFilter2: ' + strpas(Dev.FilterNames.TunerFilterName));
      Log('--> CaptureFilter: : ' + strpas(Dev.FilterNames.CaptureFilterName));
      Log('--> AnlgTunerFilter: : ' + strPas(Dev.FilterNames.AnlgTunerFilterName));
      Log('--> AnlgCaptureFilter: : ' + strPas(Dev.FilterNames.AnlgCaptureFilterName));
      Log('--> STBCaptureFilterName: : ' + strPas(Dev.FilterNames.STBCaptureFilterName));
      Log('--> ProductName: : ' + strPas(Dev.FilterNames.ProductName));
      case Dev.FilterNames.FeType of
        0: s := 'not set';
        1: s := 'DVB-C';
        2: s := 'DVB-S';
        3: s := 'DVB-S2';
        4: s := 'DVB-T';
        5: s := 'ATSC';
        6: s := 'DSS';
        7: s := 'DVB_CT';    
        8: s := 'DVB_S2_PREM';
        else s := 'unknown';
      end;
      Log('--> Front-End: ' + s);
    end;
Was mache ich hier falsch ?
  Mit Zitat antworten Zitat