Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Pointer auf Record (https://www.delphipraxis.net/96614-pointer-auf-record.html)

Gargamel 27. Jul 2007 15:50

Re: Pointer auf Record
 
Ich habe es mittlerweile herausgefunden. Auf einem holländischen Forum ... :wall:


Trotzdem vielen Dank.

Noch eine kleine Frage zum Schluss: Gibt es eine Möglichkeit, den Namen der verwendeten Grafikkarte zu ermitteln?

markusj 27. Jul 2007 16:02

Re: Pointer auf Record
 
Mit Sicherheit, zum Bleistift über WMI. Ich habs zwar noch nie gemacht, aber dort gibt es eine Möglichkeit, alle Geräte aufzulisten, wenn ich mich nicht irre.

mfG
Markus

Muetze1 28. Jul 2007 14:54

Re: Pointer auf Record
 
wenn dir der Name vom Treiber reicht: schau dir das an Damit bekommste u.a. auch den Namen des angeschlossenen Monitors mit raus. (so lange er auch Windows bekannt ist)

Gargamel 28. Jul 2007 18:42

Re: Pointer auf Record
 
Hallo

Deinen Code habe ich in einer normalen VCL-Anwendung ausprobiert. Funktioniert einwandfrei.
Ich möchte aber den Code in einer DLL nutzen.

Der Monitorname wird korrekt übergeben. Allerdings beim Name der Grafikkarte kommt nicht viel.

Info.Devicename ist vom Typ array[0..31] of Char
Info.Devicestring vom Typ array[0..127] of Char

Ich muss ganz normale Strings zurückgeben.
Gibt es eine Lösung?


Vielen Dank

Muetze1 28. Jul 2007 19:54

Re: Pointer auf Record
 
Zitat:

Zitat von Gargamel
Info.Devicename ist vom Typ array[0..31] of Char
Info.Devicestring vom Typ array[0..127] of Char

Ich muss ganz normale Strings zurückgeben.
Gibt es eine Lösung?

Delphi-Quellcode:
Result := string(Info.DeviceString);
Du bist dir aber hoffentlich im klaren, dass dies in einer DLL Funktion wie Lotto spielen ist, da der String nur temporär ist und seine Gültigkeit mit verlassen der Funktion verliert?

Die reine Konvertierung habe ich dir ja aufgezeigt aber deine Stringübergabe von der DLL macht dir wohl eher einen Strich durch die Rechnung. Siehe dazu auch Luckie's Artikel

Gargamel 28. Jul 2007 20:21

Re: Pointer auf Record
 
Hallo

Die Stringübergabe aus der DLL heraus funktioniert. Ich habe schon einige Funktionen darin implementiert.
Deine Funktion habe ich soweit abgeändert, dass die gefundenen Werte global in einem Record gespeichert werden.

Hier ist der Quellcode:

Delphi-Quellcode:
// globale Variablen

rec_displaydevice = record
  DeviceName:string;
  DeviceString:string;
  Monitorname:String;
end;

var displaydevice:array[1..4] of rec_displaydevice;
var numberdisplaydevice:integer;


function get_NumberDisplayDevice:integer;
Var
  Cntr       : Cardinal;
  Info       : TDisplayDevice;
  AdapterName : PChar;
  OldPos     : Integer;
Const
  DISPLAY_DEVICE_ATTACHED_TO_DESKTOP = $00000001;
  DISPLAY_DEVICE_MULTI_DRIVER       = $00000002;
  DISPLAY_DEVICE_PRIMARY_DEVICE     = $00000004;
  DISPLAY_DEVICE_MIRRORING_DRIVER   = $00000008;
  DISPLAY_DEVICE_VGA                = $00000010;
Begin
  NumberDisplayDevice:=0;
  Cntr := 0;
  Info.cb := SizeOf(Info);

  While EnumDisplayDevices(Nil, Cntr, Info, 0) Do
  Begin
    NumberDisplayDevice:=NumberDisplayDevice+1;

    displaydevice[NumberDisplayDevice].DeviceName:=Info.DeviceName;
    displaydevice[NumberDisplayDevice].DeviceName:=Info.DeviceString;

    AdapterName := StrAlloc(SizeOf(Info.DeviceName));
    StrCopy(AdapterName, Info.DeviceName);
    EnumDisplayDevices(AdapterName, 0, Info, 0);


    displaydevice[NumberDisplayDevice].Monitorname:=Info.DeviceString;




    StrDispose(AdapterName);

    Inc(Cntr);
  End;

  result:=NumberDisplayDevice;
End;

Muetze1 28. Jul 2007 21:57

Re: Pointer auf Record
 
Bedeutet dies nun, dass die Probleme erledigt sind?

Gargamel 28. Jul 2007 22:05

Re: Pointer auf Record
 
Hallo

Leider nicht. Ich habe einen kleinen Test gemacht und die Werte in eine Textdatei geschrieben.
Da lief alles einwandfrei. Alle Werte sind absolut korrekt.

Nur ist die String-Übergabe über die DLL fehlerhaft. Andere Funktionen, die ebenfalls Strings übertragen,
funktionieren dagegen tadellos.

Keine Ahnung, wo da der Fehler liegt.

Muetze1 28. Jul 2007 22:16

Re: Pointer auf Record
 
Zitat:

Zitat von Gargamel
Keine Ahnung, wo da der Fehler liegt.

Ich denke, ich schon:

Delphi-Quellcode:
    displaydevice[NumberDisplayDevice].DeviceName:=Info.DeviceName;
    displaydevice[NumberDisplayDevice].DeviceName:=Info.DeviceString;  // <--- !!!

    AdapterName := StrAlloc(SizeOf(Info.DeviceName));
    StrCopy(AdapterName, Info.DeviceName);
    EnumDisplayDevices(AdapterName, 0, Info, 0);


    displaydevice[NumberDisplayDevice].Monitorname:=Info.DeviceString;
Dadurch wird der folgende Aufruf wegen EnumDisplayDevices für den Monitor falsch und dadurch kommt es zu weiteren Fehlern. Copy & Paste Fehler halt...

Gargamel 28. Jul 2007 22:30

Re: Pointer auf Record
 
Hallo

Die ersten 8 Zeichen werden dargestellt. Der Rest in "Müll".

Es wird angezeigt:

\\.\DISPpf
Radeon Xpf
Plug undpf

Hinter jeder der Zeilen sind noch 2 Zeichen in Form eines Rechtecks.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 Uhr.
Seite 2 von 3     12 3      

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