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 ?