AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL - Probs mit Strings

Ein Thema von TERWI · begonnen am 3. Okt 2011 · letzter Beitrag vom 3. Okt 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#1

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 10:50
Kann es sein, dass Deine Char-Arrays um jeweils ein Char zu groß sind? IIRC gibt in C eine Zahlenagabe in eckigen Klammern die Größe an. Die Aufrufkonvention cdecl ist auch richtig? Und Du solltest besser das "packed" entkommentieren. Achja, auch nicht unwichtig: welche Delphi-Version setzt Du ein? Ggf. musst Du wohl aus Char Ansichar machen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

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

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 11:03
Alles mit Delphi 7 gemacht.
cdecl sollte ok sein - es gibt noch dutzend andere func's die ich so aufrufe und die funzen.
Ob Packed Record oder nur Record macht anscheinen keinen Unterschied.

Ich habe MAX_PATH 'einfach so' übernommen.
Kann natürlich möglich sein, dass das in C/Delphi unterschiedlich deklariert ist.
Ich habe MAX_PATH auch mal neu deklariert und zig verschiedene Werte eingesetzt - nada ....

Auch wenn MAX_Path zu groß sein sollte, müsste ich doch wenigstens für den 1. Wert 'TunerFilter' irgendwas gescheites bekommen ?!

AnsiChar statt Char bringt auch keine Änderung.

Das dumme ist: Ich hatte das schon mal am laufen, allerdings ist mir der Source abhanden gekommen und das ist ein paar Jahre her ....
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#3

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 11:06
*Pfuh* da stoßen meine bescheidenen Kenntnisse bereits an ihre Grenzen. Hast Du den Record vor dem Aufruf genullt? Ich weiß ja nicht, ob die DLL das intern erledigt, schaden kann es wohl nicht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

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

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 11:15
Nein, hab ich nicht. Warum auch ?
Vermute eher mal, das die REC-Deklaration falsch ist und / oder das casten nicht funktioniert....
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.719 Beiträge
 
Delphi 12 Athens
 
#5

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 11:23
Dennoch solltest du es mal mit stdcall versuchen.
Vom Aufruf her sind die sich gleich. Nur das Aufräumen der Parameter ist anders.

Delphi-Quellcode:
type
  {$MINENUMSIZE 2}
  TYPE_FRONT_END = (
    TYPE_FE_UNKNOWN, // not set
    TYPE_FE_DVB_C, // DVB-C
    TYPE_FE_DVB_S, // DVB-S
    TYPE_FE_DVB_S2, // DVB-S2
    TYPE_FE_DVB_T, // DVB-T
    TYPE_FE_ATSC, // ATSC
    TYPE_FE_DSS, // DSS
    TYPE_FE_DVB_CT, // DVB-C and DVB-T
    TYPE_FE_DVB_S2_PREM); // TT-premium with Dual DVB-S2 and digital capture
  {$MINENUMSIZE 1}  // Standardwert

  TS_FilterNames = {packed} record
    szTunerFilterName: array[0..MAX_PATH-1] of AnsiChar; // oder [1..MAX_PATH];
    szTunerFilterName2: array[0..MAX_PATH-1] of AnsiChar;
    szCaptureFilterName: array[0..MAX_PATH-1] of AnsiChar;
    szAnlgTunerFilterName: array[0..MAX_PATH-1] of AnsiChar;
    szAnlgCaptureFilterName: array[0..MAX_PATH-1] of AnsiChar;
    szSTBCaptureFilterName: array[0..MAX_PATH-1] of AnsiChar;
    szProductName: array[0..MAX_PATH-1] of AnsiChar;
    FeType: TYPE_FRONT_END;
  end;

function bdaapiGetDevNameAndFEType(hOpen: THandle; var FilterNames: TS_FilterNames): HRESULT; stdcall;
Das PACKED hat auf die Char/AnsiChar-Arrays keine Wirkung, da diese sowieso nur aus einzelnen Bytes bestehen und dadurch praktisch nicht ausgerichtet werden.
(Sie werden an den Bytegrenzen ausgerichtet, was somit dem PACKED entspricht)

Aber auf FeType dürfte PACKED eine wirkung zeigen, jedenfalls bei der falschen Arraylänge, da 7 Byte mehr (1 je Array), was auf vielfache von 2 (Sizeof(TYPE_FRONT_END) ), also 8 aufgerundet wird und somit diesen Wert verschiebt.


Wie bist du eigentlich von HANDLE auf HWND gekommen?
Ist das denn wirklich ein Fenster-Handle?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

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

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 12:27
KA, wieso ich da HWND (integer) statt THandle (LongWord) drin habe ....
Hab es geändert - funzt nach wie vor (alle anderen Funktionen).

Hab noch mal mit MAX_PATH gespielt und in meinen alten Files doch noch was gefunden:
Wenn ich 389 (was ne dösige Zahl !?) einsetze, kommt (teilweise) was brauchbares heraus.
Leider kommt für FE-Type immer nur eine '0'.

Interessant ist auch: Es gibt DLL-Versionen 1.0.1.11 und 1.0.1.21.
Die .11er hat einen 'kürzeren' Record.
Mit MAX_PATH = 389 kann ich dann auch die FE-Typen auslesen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.669 Beiträge
 
Delphi 12 Athens
 
#7

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 12:39
Naja, MAX_PATH ist ja auch nur eine Konstante, wenn die intern geändert wird darf man sich nicht wundern. Aber wer kommt auf so eine bescheuerte Idee? Gibt es keine Doku dazu, wo das zumindest erwähnt wird?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.719 Beiträge
 
Delphi 12 Athens
 
#8

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 12:50
0..389 = 390, da du wohl immernoch das -1 vergessen hast.
Das wären 1,5*MSDN-Library durchsuchenMAX_PATH, aber wie schon erwähnt, sollte man an vorgegebenen Konstanten nicht rumspielen.

Delphi-Quellcode:
var
  S: TFileStream;
  N: FilterNames;

S := TFileStream.Create('dateiname', fmCreate);

FillChar(N, SizeOf(N), 0);
bdaapiGetDevNameAndFEType(hOpen, N);
S.WriteBuffer(N, SizeOf(N));

FillChar(N, SizeOf(N), 255);
bdaapiGetDevNameAndFEType(hOpen, N);
S.WriteBuffer(N, SizeOf(N));

S.Free;
Und wenn man sich mit garnicht ssicher ist, dann doch eher wie Folgt.
Delphi-Quellcode:
function bdaapiGetDevNameAndFEType(hOpen: THandle; P: Pointer): HRESULT; stdcall;

var
  S: TFileStream;
  B: array[0..8191] of Byte; // 8 KB sollten groß genug sein (selbst 2 KB dürften, laut Spezifikation, ausreichen)

S := TFileStream.Create('dateiname', fmCreate);

FillChar(B, SizeOf(B), 0);
bdaapiGetDevNameAndFEType(hOpen, @B);
S.WriteBuffer(B, SizeOf(B));

FillChar(B, SizeOf(B), 255);
bdaapiGetDevNameAndFEType(hOpen, @B);
S.WriteBuffer(B, SizeOf(B));

S.Free;
Und die Datei hier anhängen.

Ginge natürlich auch einfacher, wenn man die Möglichkeiten des Debuggers nutzen und sich die Variable direkt im Speicher ansieht.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Okt 2011 um 13:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

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

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 13:16
Ich habs einfach mal so gemacht:
Code:
S.WriteBuffer(Dev.FilterNames, SizeOf(Dev.FilterNames));
Man sieht die Strings in der Datei - Es sind 2 Geräte die gelistet werden.
Hab mir das aber nur mit dem Editor angesehen.
'Dateiname1.txt' ist für die DLL .11, 'Dateiname2.txt' für die .21

Für den Debugger bin ich A) 'zu blöd' und B) habe ich den beim proggen mit DirectShow Dingen eh immer aus.
Angehängte Dateien
Dateityp: txt dateiname1.txt (3,1 KB, 8x aufgerufen)
Dateityp: txt dateiname2.txt (5,3 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

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

AW: DLL - Probs mit Strings

  Alt 3. Okt 2011, 13:53
Hab mir die Dateien nun mal mit den PS-PAD im Hexeditor angesehen.

Mit den Daten aus der DLL-.11 erkenne ich folgendes:
String_1 hat 520 - 1 Byte (Tuner-Name)
String_2 hat 520 - 1 Byte (Capturer-Name)
String_3 hat 260 - 1 Byte (leer)
String_4 hat 260 - 1 Byte (Geräte-Name)
FE-Type ist ein Byte (passt auch zum Gerät)

Mit den Daten aus der DLL-.21 erkenne scheint das ähnlich.
Allerdings sehe ich da nirgendwo am Ende des Records eine Zahl für den FE-Type ....

Schon eom wenig eigenartig, das hier MAX_PATH mal mit 520 und dann mit 260 Zeichen verwendet wird.
Als Ansi-String kann ich das nicht wirklich erkennen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz