![]() |
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:
Hier nun der Code der DLL
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.
Delphi-Quellcode:
Ich bekomme dabei die Fehlermeldung, dass eine "Ungültige Zeigeroperation" vorliegt.
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. 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 |
Re: DLL ungültige Zeigeroperation
Du hast ja dee grünen Text schön mit reinkopiert. Hast du ihn auch gelesen?
|
Re: DLL ungültige Zeigeroperation
Zitat:
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:
Statt dem String habe ich es in Shortstring geändert.
function GetProzessorName: string;
var reg: TRegistry; begin 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? |
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.
|
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. |
Re: DLL ungültige Zeigeroperation
Nicht in der ersten Unit, in der Projektdatei (*.dpr) muss ShareMem geused werden!
|
Re: DLL ungültige Zeigeroperation
Vielen Dank,
jetzt funktioniert es wie gewünscht. |
Re: DLL ungültige Zeigeroperation
Hi,
was ist eigentlich das? Zitat:
Delphi-Quellcode:
Gruß
external 'getcpunames.dll';
// oder sogar nur external 'getcpunames'; Felix |
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.
|
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 07:46 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