Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Übersetzung von GetSystemDefaultLocaleName von C nach Delphi (https://www.delphipraxis.net/96665-uebersetzung-von-getsystemdefaultlocalename-von-c-nach-delphi.html)

MagicAndre1981 28. Jul 2007 21:35


Übersetzung von GetSystemDefaultLocaleName von C nach Delphi
 
Hi,

kann mir mal jemand bei der Übersetzung der Funktion MSDN-Library durchsuchenGetSystemDefaultLocaleName helfen? Ich will die Funktion aus der kernell32.dll dynamisch laden. Das Handle ist auch größer 0 und mit GetProcAdress bekomme ich Adresse, aber wenn ich die Funktion dann aufrufe bekomme ich nur japanische/chinesische Zeichen :wall:

Delphi-Quellcode:
function GetSystemLocaleName : string;
var po :TFarProc;
    DLLWnd :THandle;
    localeString : LPWStr;
    GetSystemDefaultLocaleName : function(  var lpLocaleName : LPWStr;
                                            cchLocaleName : integer)
                                            : integer; stdcall;
begin
  Result := '';
  DLLWnd := LoadLibrary('kernel32');
  if DLLWnd > 0 then
  begin
    try
      po := GetProcAddress(DLLWnd, 'GetSystemDefaultLocaleName');
      if po <> nil then
      begin
        @GetSystemDefaultLocaleName := po;
        if GetSystemDefaultLocaleName(localeString, LOCALE_NAME_MAX_LENGTH) > 0 then
        Begin
          Result := localeString;
        End;
      end;
    finally
      FreeLibrary(DLLWnd);
    end;
  end;
end;
Wo hab ich Mist gemacht?

Ich sollte öfters mal wieder was mit Delphi machen, ist alles total eingerostet :wall: :wall:

Christian Seehase 28. Jul 2007 21:44

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Moin André,

probier mal, ob das hier klappt:

Delphi-Quellcode:
function GetSystemLocaleName : string;
var po :TFarProc;
    DLLWnd :THandle;
    localeString : LPWStr;
    GetSystemDefaultLocaleName : function(  const lpLocaleName : LPWStr;
                                            cchLocaleName : integer)
                                            : integer; stdcall;
begin
  Result := '';
  DLLWnd := LoadLibrary('kernel32');
  if DLLWnd > 0 then
  begin
    try
      po := GetProcAddress(DLLWnd, 'GetSystemDefaultLocaleName');
      if po <> nil then
      begin
        @GetSystemDefaultLocaleName := po;
        localeString := AllocMem(LOCALE_NAME_MAX_LENGTH);
        try
          if GetSystemDefaultLocaleName(localeString, LOCALE_NAME_MAX_LENGTH) > 0 then
          Begin
          Result := localeString;
          End;
        finally
        end;
      end;
    finally
      FreeLibrary(DLLWnd);
    end;
  end;
end;

MagicAndre1981 28. Jul 2007 21:51

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Perfekt! Das AllocMem hab ich vergessen :wall: :wall:

Danke dir vielmals :hello: :thumb:

Christian Seehase 28. Jul 2007 22:10

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Moin André,

ich hab' noch etwas anderes geändert ;-)

MagicAndre1981 28. Jul 2007 22:18

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
ja und das const :oops: :stupid:

aber es löst nicht mein Problem. Ich krieg trotzdem nicht die Betriebssystemsprache, sondern nur die Sprache die ich in der Systemsteuerung auswähle. ich brauch aber en-US auf einem US amerikanischen Windows mit deutschen Tastatur und Ländereinstellungen :?

Christian Seehase 28. Jul 2007 23:00

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Moin André,

und was ist mit MSDN-Library durchsuchenGetLocaleInfoEx?

(kann's mangels installiertem Vista leider nicht testen)


BTW:
um noch mal kurz auf das const zu kommen:
Das ist einer der Gründe, warum ich die delphispezifische Deklaration von API-Funktionen mit var nicht mag.
Nimmt man var, kann man die Beispiele nicht so nutzen wie vorgegeben, und ist auch eingeschränkt was man übergibt (nil geht z.B. nicht).

Robert Marquardt 29. Jul 2007 05:16

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Das var ist hier auch noch vollkommen falsch. Es wuerde bedeuten das ein Zeiger auf einen PWideChar uebergeben wird. Es soll aber direkt ein PWideChar uebergeben werden, naemlich der Zeiger auf den Beginn des Puffers in dem der String abgelegt wird.

turboPASCAL 29. Jul 2007 07:31

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Delphi-Quellcode:
function GetSystemLocaleName : string;
var
  DLLWnd :THandle;
  localeString : LPWStr;
  GetSystemDefaultLocaleName : function(const lpLocaleName : LPWStr;
                                        cchLocaleName : integer): integer; stdcall;
begin
  Result := '';
  DLLWnd := LoadLibrary(kernel32); // <-<< als constante und nicht als String
  if DLLWnd > 0 then              //      ala 'kernel32' sondern denn dann
  begin                           //      LoadLibrary('kernel32.dll')
    try
      @GetSystemDefaultLocaleName := GetProcAddress(DLLWnd, 'GetSystemDefaultLocaleName');

      if @GetSystemDefaultLocaleName <> nil then
      begin
        localeString := AllocMem(1024);
        if GetSystemDefaultLocaleName(localeString, 1024) > 0 then
        Begin
          Result := string(localeString); // <-<< localeString ist doch ein
         End;                             //      PWideChar also Unicode... *grübel*
      end else                                  
        MessageBox(Application.Handle, 'Failed to perform GetSystemDefaultLocaleName.',
          PChar(Application.Title), MB_ICONERROR or MB_OK);

    finally
      FreeLibrary(DLLWnd);
    end;
  end;
end;
Ich habe mal nachgeschaut, bei meinem XP / SP1 gibt es keine Funktion "GetSystemDefaultLocaleName"
in der Kernel32. :gruebel:

MagicAndre1981 29. Jul 2007 11:12

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Zitat:

Zitat von turboPASCAL
Ich habe mal nachgeschaut, bei meinem XP / SP1 gibt es keine Funktion "GetSystemDefaultLocaleName"
in der Kernel32. :gruebel:

die Funktion gibt es erst ab Vista.

Zitat:

Zitat von Robert Marquardt
Das var ist hier auch noch vollkommen falsch. Es wuerde bedeuten das ein Zeiger auf einen PWideChar uebergeben wird. Es soll aber direkt ein PWideChar uebergeben werden, naemlich der Zeiger auf den Beginn des Puffers in dem der String abgelegt wird.

Ja, das ist mir später auch aufgefallen. Danke für die Erklärung.

Zitat:

Zitat von Christian Seehase
Moin André,

und was ist mit MSDN-Library durchsuchenGetLocaleInfoEx?

(kann's mangels installiertem Vista leider nicht testen)

Ok, ich schau mir das mal an.

thkerkmann 29. Jul 2007 11:20

Re: Übersetzung von GetSystemDefaultLocaleName von C nach De
 
Hi,

ich glaube für Dein Problem brauchst Du die Funktion

MSDN-Library durchsuchenGetUserDefaultUILanguage

Schönen Sonntag


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:47 Uhr.
Seite 1 von 2  1 2      

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