AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetModuleName wirft Exception

Ein Thema von Jelen · begonnen am 12. Jul 2012 · letzter Beitrag vom 12. Jul 2012
Antwort Antwort
Jelen

Registriert seit: 5. Nov 2003
45 Beiträge
 
#1

GetModuleName wirft Exception

  Alt 12. Jul 2012, 15:22
Hallo,
hat jemand schon mal versucht, GetModuleName mit einem Handle für die 'TMSSmoothControlsPackPkgD2009.bpl' aufzurufen?
Folgender Code läuft bei mir auf eine Exception, die ich mir nicht erklären kann:
Delphi-Quellcode:
procedure BplInfo (ts: TStrings);
 {+++++++ BplInfo ++++++++++++++++++++++++++++++}
 function BplPath (const BplName: String): AnsiString;
  var MHnd: Cardinal;
      j,k: integer;
      ModuleBuffer: array [0..63] of AnsiChar;
      PathBuffer: array [0..255] of Char;
  begin
   StrPCopy(@ModuleBuffer,BplName);
   MHnd := GetModuleHandle(@ModuleBuffer);
   if MHnd = 0
   then Result := 'nicht geladen'
   else begin
         Result := GetModuleName(MHnd);
        end;
   Result := BplName+': "'+Result+'"';
  end;
 {+++++++ BplInfo ++++++++++++++++++++++++++++++}
 begin
  try
   ts.Append(BplPath('bdertl120.bpl'));
   ts.Append(BplPath('dbrtl120.bpl'));
   ts.Append(BplPath('designide120.bpl'));
   ts.Append(BplPath('rtl120.bpl'));
   ts.Append(BplPath('tee8120.bpl'));
   ts.Append(BplPath('TMSSmoothControlsPackPkgD2009.bpl'));
   ts.Append(BplPath('vcl120.bpl'));
   ts.Append(BplPath('vclactnband120.bpl'));
   ts.Append(BplPath('vcldb120.bpl'));
   ts.Append(BplPath('vclimg120.bpl'));
   ts.Append(BplPath('vclsmp120.bpl'));
   ts.Append(BplPath('vclx120.bpl'));
   ts.Append(BplPath('VirtualTreesD12.bpl'));
   ts.Append(BplPath('xmlrtl120.bpl'));
  except on e: Exception
  do ts.Append('BplInfo: "'+e.Message+'"');
  end;
 end;
Das Ergebnis sieht dann so aus:
bdertl120.bpl: "C:\Windows\system32\bdertl120.bpl"
dbrtl120.bpl: "C:\Windows\system32\dbrtl120.bpl"
designide120.bpl: "C:\Program Files (x86)\CodeGear\RAD Studio\6.0\bin\designide120.bpl"
rtl120.bpl: "C:\Windows\system32\rtl120.bpl"
tee8120.bpl: "C:\Windows\system32\Tee8120.bpl"
BplInfo: "Zugriffsverletzung bei Adresse 003C4761 in Modul 'test.bpl'. Lesen von Adresse 00000038"
Die ersten 5 Aufrufe gehen also sauber durch, und dann kommt die TMS...bpl dran und es kracht.
Mit GetModuleFileName hab' ich es auch probiert, dasselbe Problem.

Hat jemand 'ne Idee?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: GetModuleName wirft Exception

  Alt 12. Jul 2012, 17:25
Schau mal wie viel Zeichen "TMSSmoothControlsPackPkgD2009.bpl" und wie groß dein Buffer "ModuleBuffer".
Und jetzt bedenke das 1 Zeichen in D2009 2 Byte lang ist und du fälschlicherweis AnsiChar verwendest.

Wenn mich nicht alles täusch müsstest du auch ein paar Compilerwarnungen bekommen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: GetModuleName wirft Exception

  Alt 12. Jul 2012, 17:31
Wozu diese Zwischenpuffer?
Delphi-Quellcode:
function BplPath(const BplName: String): AnsiString;
  var MHnd: Cardinal;
begin
   MHnd := GetModuleHandleW(PWideChar(BplName));
   if MHnd = 0
   then Result := 'nicht geladen'
   else begin
         Result := GetModuleName(MHnd);
        end;
   Result := BplName+': "'+Result+'"';
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: GetModuleName wirft Exception

  Alt 12. Jul 2012, 17:57
Delphi-Quellcode:
function BplPath(const BplName: String): AnsiString;
  var MHnd: Cardinal;
begin
   MHnd := GetModuleHandleW(PWideChar(BplName));
Wenn schon hart GetModuleHandleW und PWideChar verwendet wird, dann auch hart WideString/UnicodeString verwenden.


@Jelen:
Der Compiler hat nicht zufällig von unsicherem String-Zeugs gefaselt?


Ich sag's gerne nochmals (immer und immer wieder ) :

xxxW + WideChar + PWideChar + WideString/UnicodeString
xxxA + AnsiChar + PAnsiChar + AnsiString
xxx + Char + PChar + String

und niemals irgendwie gemischt
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Jelen

Registriert seit: 5. Nov 2003
45 Beiträge
 
#5

AW: GetModuleName wirft Exception

  Alt 12. Jul 2012, 20:15
Au weia. Da hab' ich ja mächtig auf dem Schlauch gestanden...

@Bernhard Geyer: Über die 33 Zeichen des Dateinamens hab' ich mir auch Gedanken gemacht.
Aber das war leider wie mit dem Wald und den Bäumen, das mit den Chars und AnsiChars...
Ich dachte immer nur - das kann's nicht sein.

@shmia: Ist mir sehr sympathisch, Deine Kurzform. In meiner jetzigen Fassung ist noch das überflüssige begin - end rausgeflogen.

@himitsu: Das Gefasel mit den bedenklichen Stringumwandlungen hatte ich dem Compiler verboten, weil das ganze Projekt aus einer frühen Delphi-Version stammt, wo String = ShortString war. Beim Portieren des Projekts auf D2009 klemmte es an allen Ecken und Enden, als die ShortStrings zu UnicodeStrings wurden, mit Umwandlung aller String-Deklarationen zu AnsiStrings lief es wesentlich reibungsloser.
In diesem Fall war das natürlich ärgerlich, denn das "Gefasel" hätte mir sicher den Wald gezeigt!

Danke Euch für die Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: GetModuleName wirft Exception

  Alt 12. Jul 2012, 22:12
Zitat:
wo String = ShortString war.
Delphi 1 oder 2?

Nja, alles einfach nur auf AnsiString und PAnsiChar abzuändern, hilft auch nicht immer, denn da muß man ebenfalls aufpassen, ob auch alle aufgerufenen Funktionen und vorallem die APIs mit ANSI arbeiten.
PS: Es gibt keine ANSI-TStringList, denn diese hat man in der Unit AnsiStrings glatt vergessen, genauso arbeiten alle VCL-Komponenten fast ausschließlich nur noch mit Unicode.

Delphi-Quellcode:
procedure BplInfo(ts: TStrings);
  procedure AddInfo(const BplName: String);
  var MHnd: THandle;
  begin
    MHnd := GetModuleHandle(PChar(BplName));
    if MHnd = 0 then
      ts.Add(BplName + ': nicht geladen')
    else
      ts.Add(BplName + ': "' + GetModuleName(MHnd) + '"');
  end;
begin
  AddInfo('bdertl120.bpl');
  AddInfo('dbrtl120.bpl');
  AddInfo('designide120.bpl');
  AddInfo('rtl120.bpl');
  AddInfo('tee8120.bpl');
  AddInfo('TMSSmoothControlsPackPkgD2009.bpl');
  AddInfo('vcl120.bpl');
  AddInfo('vclactnband120.bpl');
  AddInfo('vcldb120.bpl');
  AddInfo('vclimg120.bpl');
  AddInfo('vclsmp120.bpl');
  AddInfo('vclx120.bpl');
  AddInfo('VirtualTreesD12.bpl');
  AddInfo('xmlrtl120.bpl');
end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (12. Jul 2012 um 22:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 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