Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Probleme mit SHGetKnownFolderPath (https://www.delphipraxis.net/177707-probleme-mit-shgetknownfolderpath.html)

TiGü 25. Nov 2013 09:26

AW: Probleme mit SHGetKnownFolderPath
 
Zitat:

Zitat von Andidreas (Beitrag 1237051)
Liegt der Fehler dann nicht eher in der Funktion für Windows 7, das diese einen Speicherfehler verursacht?

Weiß jetzt nicht, ob es dein Problem beseitigt, aber es wäre schon gut
Delphi-Quellcode:
CoTaskMemFree(sPath)
in deiner Funktion zu ergänzen (siehe MSDN).

Andidreas 25. Nov 2013 09:59

AW: Probleme mit SHGetKnownFolderPath
 
In der DLL habe ich jetzt mal meine Funktion die unter Windows 7 die Pfade ermitteln soll, gegen den folgenden Code ausgetauscht:

Delphi-Quellcode:
  SHGetKnownFolderPath(FOLDERID_ProgramData, 0, 0, sPath);
  ShowMessage(sPath);
  CoTaskMemFree(sPath);
Mein Runtime Error kommt immer noch...
Kann das evtl. auch an der ShlObj Unit liegen?

Als letzte Idee würde mir noch einfallen das ganze gegen die Funktion GetEnvironmentVariable auszutauschen... Was ich nicht unbedingt möchte...

@DeddyH
Ich hoffe ich konnte in meinem letzten Beitrag deine Fragen nach dem Austausch von Objekten und Klassen zwischen Forms und DLLs beantworten?!

Sir Rufo 25. Nov 2013 10:45

AW: Probleme mit SHGetKnownFolderPath
 
Also hiermit habe ich keine Probleme
Delphi-Quellcode:
library PathLib;

uses
  Winapi.ActiveX,
  Winapi.ShellAPI,
  Winapi.ShlObj,
  Winapi.Windows,
  System.SysUtils,
  System.Classes;

{$R *.res}

function GetKnownFolderPath( ACSIDL : TGUID ) : WideString;
  var
    LPath : PWideChar;
  begin
    if SHGetKnownFolderPath( ACSIDL, 0, 0, LPath ) = S_OK
    then
      Result := LPath
    else
      Result := '';
  end;

function GetSpecialFolder( AFolderID : Integer ) : WideString;
  var
    LPath : PWideChar;
  begin
    GetMem( LPath, MAX_PATH * SizeOf( WideChar ) );
    try
      if SHGetSpecialFolderPathW( 0, LPath, AFolderID, False )
      then
        Result := LPath
      else
        Result := '';
    finally
      FreeMem( LPath );
    end;
  end;

function DocumentRoot : WideString; stdcall;
  begin
    if CheckWin32Version( 9 )
    then
      Result := GetKnownFolderPath( StringToGUID( '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}' ) )
    else
      Result := GetSpecialFolder( CSIDL_MYDOCUMENTS );
  end;

exports
  DocumentRoot;

begin

end.
Delphi-Quellcode:
unit View.Main;

interface

  uses
    Winapi.Windows,
    Winapi.Messages,
    System.SysUtils,
    System.Variants,
    System.Classes,
    Vcl.Graphics,
    Vcl.Controls,
    Vcl.Forms,
    Vcl.Dialogs,
    Vcl.StdCtrls;

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

  var
    MainView : TMainView;

implementation

{$R *.dfm}
  function DocumentRoot : WideString; stdcall; external 'PathLib.dll';

  procedure TMainView.Button1Click( Sender : TObject );
    begin
      Caption := DocumentRoot;
    end;

end.

Andidreas 25. Nov 2013 13:50

AW: Probleme mit SHGetKnownFolderPath
 
@Sir Rufo...

Hab deinen Source in meiner DLL getestet, ich bekommen weiterhin den Runtime Error... :cry:

Liegt es evtl. wirklich an DeddyH's Vermutung?

Sir Rufo 25. Nov 2013 13:54

AW: Probleme mit SHGetKnownFolderPath
 
Zitat:

Zitat von Andidreas (Beitrag 1237345)
@Sir Rufo...

Hab deinen Source in meiner DLL getestet, ich bekommen weiterhin den Runtime Error... :cry:

Liegt es evtl. wirklich an DeddyH's Vermutung?

Probier doch mal komplett meinen Source aus ... wenn der funktioniert, dann hat es damit rein gar nichts zu tun ;)

hathor 25. Nov 2013 14:41

AW: Probleme mit SHGetKnownFolderPath
 
SHGetKnownFolderPath ist in ShlObj, aber funktioniert erst ab VISTA.

@Andidreas:
Du hast zwar "WINDOWS 7" geschrieben, aber bist Du versehentlich auf einem anderen BS?

Sir Rufo 25. Nov 2013 14:45

AW: Probleme mit SHGetKnownFolderPath
 
Zitat:

Zitat von hathor (Beitrag 1237354)
SHGetKnownFolderPath ist in ShlObj, aber funktioniert erst ab VISTA.

Er schreibt ja, dass er mit Windows 7 Probleme hat.
Unter Windows XP war die Welt noch in Ordnung (darum hat er es mit SHGetKnownFolderPath für Windows 7 versucht) ;)

jaenicke 25. Nov 2013 15:27

AW: Probleme mit SHGetKnownFolderPath
 
Fehlt vielleicht ein CoInitialize/Ex?
Was sagt GetLastError?

Runtime Error direkt aus der API Funktion hört sich seltsam an.

rwalper 25. Nov 2013 16:01

AW: Probleme mit SHGetKnownFolderPath
 
1. Nur mal eine Idee: Benutzt Du vielleicht in Deiner DLL einen anderen oder auch speziellen Speichermanager als in der Exe?

2. Testhalber würde ich mal folgendes in der DLL ändern:
Delphi-Quellcode:
function fnGetKnownFolderPath(sKnownFolderID : String) : String;
var
  sPath: String;
begin
  SetLength(SPath, MAX_PATH);
  {$IFDEF VER220}
  If sKnownFolderID = 'FOLDERID_Desktop' Then SHGetKnownFolderPath(FOLDERID_Desktop,0, 0, PWideChar(sPath));


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr.
Seite 2 von 2     12   

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