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.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var dname: String; begin SetLength(dname, 1025); FillChar(dname[1], 1025, 0);
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.