Autor Beitrag
bbfan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Mi 09.01.08 16:18 
Hallo Leute!

Wie kann ich diese Funktin verwenden, so dass ein lesbares ergebnis erscheint?


ausblenden Delphi-Quelltext
1:
2:
3:
4:
function capDriverGetName(hwnd:THandle; szName:LongInt; wSize:Word):LongInt;
begin
  Result := SendMessage(hwnd, WM_CAP_DRIVER_GET_NAME, wSize, szName);
end;


Das hier klappt nicht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 
var
 dname:String;
begin
 capDriverGetName(ghCapWnd,integer(@dname),sizeof(dname));
 label1.caption:= string(dname);
end;



Moderiert von user profile iconChristian S.: Topic aus Multimedia / Grafik verschoben am Mi 09.01.2008 um 16:43
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mi 09.01.08 17:34 
Damit das funktionieren kann muss du einen Speicherbereich und dessen Größe. Und in deinem Falle ist dein String leer und du übergibst den Pointer der Variable dname aber nicht den Pointer dessen Daten.

Also solltest du zu erst mit SetLength die Größe des Stringes festlegen und dann den Pointer auf das erste Zeichen übergeben. Beachte aber, dass der Inhalt des Stringes nicht initialisiert wird also solltest du ihn zusätzlich noch auf 0 initialisieren. Aussehen würde das dann in etwa so.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
 dname: String;
begin
  SetLength(dname, 1025);
  FillChar(dname[1], 10250);

  capDriverGetName(ghCapWnd, integer(@dname[1]), 1024);
  label1.caption := pChar(dname);
end;

Bitte dabei beachten, dass du die Größe des Buffers nicht überschreitest. Das letzte Zeichen ist nur zur Sicherheit falls der Buffer einmal komplett bis zum Anschlag gefüllt werden sollte. So würde immer noch ein #0 anhängen selbst dann wenn diese Methode es nicht tun würde. Vorrausgesetzt die übergebene Größe wird beachtet.

Das pChar(dname) mache ich deswegen so, damit Delphi nicht die im String gespeicherte Länge benutzt sondern den Text als nullterminierten String betrachtet. Dann würde er beim Erste #0 aufhören. Ansonsten würde er den kompletten Text bis zum Ende als Text betrachten.

PS: Du solltest in jedem Falle auch den Rückgabewert berücksichtigen, denn der bestimmt meistens immer obs geklappt hat oder nicht.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Do 10.01.08 09:05 
Vielen Dank für diese Antwort!!! Wirklich sehr gut! Es funkt auch.

Warum übergibst du ein "dname[1]" und nicht "dname" ?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Do 10.01.08 10:06 
Das liegt an dem Prinzip der Longstrings begründet. Der @ Operator liefert die Adresse der aktuellen Daten zurück. Ich sage dazu bewusst Daten, denn Longstrings sind in Wirklichkeit Pointer. Also sind die Daten von dname nicht, wie man vermuten mag, der Text sondern eine Zeiger auf einen Speicherbereich der den Text enthält. Wenn man also sagt @dname, dann würdest du lediglich die Adresse der Variable dname bekommen. Mit @dname[1] wird als Daten aber ganz bewusst das erste Zeichen des Textes gewählt und somit bekommst du die Adresse des ersten Zeichens. Also die Adresse des Speicherbereiches in dem der Text gespeichert wird.

Gleiches Problem tritt bei FillChar auf. Nur, dass dort durch den var Parameter kein offensichtlicher Pointer angegeben werden muss. Bei var Parameter macht der Kompiler intern aber nichts anderes als einen @ Operator. Also dort wird auch die Adresse der Daten ermittelt und diese als Pointer übergeben. Deswegen muss man bei Longstrings überall aufpassen, dass man die richtigen Daten übergibt.

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
bbfan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 164



BeitragVerfasst: Do 10.01.08 11:46 
Vielen Dank!