Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL ungültige Zeigeroperation (https://www.delphipraxis.net/130757-dll-ungueltige-zeigeroperation.html)

S4SH1981 12. Mär 2009 17:40


DLL ungültige Zeigeroperation
 
Hallo zusammen,

habe folgendes Problem mit der DLL Programmierung.
Ich möchte viele Sachen in seperate DLL Dateien auslagern.

Es soll mir lediglich nur der Prozessorname ausgelesen werden.

Hier der Code der Unit
Delphi-Quellcode:
unit GetCPUName;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

function GetProzessorName : string;
external 'C:\***\DLL2\getcpunames.dll';


{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text := GetProzessorName;
end;

end.
Hier nun der Code der DLL

Delphi-Quellcode:
library GETCPUNAMES;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }
 

uses
  Windows,
  Messages,
  SysUtils,
  Variants,
  Classes,
  Graphics,
  Controls,
  Forms,
  Dialogs,
  StdCtrls,
  Registry;

{$R *.res}

function GetProzessorName: string;
var reg: TRegistry;
begin
  result:='Unbekannter Prozessor';
  reg:=TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    reg.OpenKey('Hardware\Description\System\CentralProcessor\0', false);
    result:=reg.ReadString('ProcessorNameString');
  finally
    reg.free;
  end;
end;

exports
  GetProzessorname;

begin
end.
Ich bekomme dabei die Fehlermeldung, dass eine "Ungültige Zeigeroperation" vorliegt.
Nach dem Abnicken der Fehlermeldung erhalte ich dann doch den Namen.
Wäre nur schön wenn die Fehlermeldung nicht erscheinen würde.

Es ist mit Sicherheit nur ein kleiner Fehler, aber zurzeit komme ich da nicht drauf und setze mal wieder auf eure gute Hilfe.

Gruß S4SH

sirius 12. Mär 2009 17:42

Re: DLL ungültige Zeigeroperation
 
Du hast ja dee grünen Text schön mit reinkopiert. Hast du ihn auch gelesen?

S4SH1981 13. Mär 2009 16:51

Re: DLL ungültige Zeigeroperation
 
Zitat:

Zitat von sirius
Du hast ja dee grünen Text schön mit reinkopiert. Hast du ihn auch gelesen?

Nein habe ich nicht gelesen.
Habe jetzt in der DLL und dem Hauptprogramm "SHAREMEM" in die Uses Klausel eingefügt.

Delphi-Quellcode:
function GetProzessorName : string;
external 'C:\***\DLL2\getcpunames.dll';
Delphi-Quellcode:
function GetProzessorName: string;
var reg: TRegistry;
begin
Statt dem String habe ich es in Shortstring geändert.
Lasse ich nun das Programm laufen, erhalte ich auch den Prozessornamen.
Nur nach dem Beenden kommt wieder die Fehlermeldung "Ungültige Zeigeroperation"

Um wieder mit dem Rechner zu arbeiten muss ich schon über den Taskmanager Delphi beenden.

Muss ich sharemem auf 0 setzen oder wie kriege ich mein kleines Problem in den Griff?

Luckie 13. Mär 2009 17:04

Re: DLL ungültige Zeigeroperation
 
Wie sharemem auf null setzen? das ist eine Unit, die die Borland-DLL-Memorymanager DLL einbindet. Diese muss in der FLL und im Projekt als erste DLL in der uses Liste stehen.

S4SH1981 13. Mär 2009 17:38

Re: DLL ungültige Zeigeroperation
 
Habe jetzt in der DLL und der Unit sharemem in der Uses Klausel an erste Prosition gesetzt.
Der Fehler mit der Ungültigen Zeigeroperation bleibt jedoch.

Dunkel 13. Mär 2009 17:55

Re: DLL ungültige Zeigeroperation
 
Nicht in der ersten Unit, in der Projektdatei (*.dpr) muss ShareMem geused werden!

S4SH1981 13. Mär 2009 17:58

Re: DLL ungültige Zeigeroperation
 
Vielen Dank,

jetzt funktioniert es wie gewünscht.

FAlter 13. Mär 2009 18:04

Re: DLL ungültige Zeigeroperation
 
Hi,

was ist eigentlich das?

Zitat:

Zitat von S4SH1981
Delphi-Quellcode:
function GetProzessorName : string;
external 'C:\***\DLL2\getcpunames.dll';

Absolute Pfade unter external? :shock:

Delphi-Quellcode:
external 'getcpunames.dll';
// oder sogar nur
external 'getcpunames';
Gruß
Felix

igel457 13. Mär 2009 18:07

Re: DLL ungültige Zeigeroperation
 
Die einfachste Lösung ist jedoch, "string" einfach durch "ShortString" zu ersetzen. Dann hast du zwar nur maximal 255 Zeichen, ich denke aber nicht, dass der Prozessorname diese Grenze überschreitet.

S4SH1981 13. Mär 2009 18:22

Re: DLL ungültige Zeigeroperation
 
habe die absoluten pfade aus einem tutorial.

werde es aber mal mit deiner version probieren. @ Falter


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz