Einzelnen Beitrag anzeigen

Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Probleme mit SHGetKnownFolderPath

  Alt 22. Nov 2013, 10:20
Delphi-Version: XE
Hallo zusammen,

ich habe mir vor einiger Zeit eine Funktion gebastelt über die ich unter Windows 7 die Standard Pfade von Windows auslesen kann:

Delphi-Quellcode:

  //Constants
  const
    FOLDERID_Desktop: KNOWNFOLDERID = '{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}'; //CSIDL_DESKTOPDIRECTORY
    FOLDERID_LocalAppData: KNOWNFOLDERID = '{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}'; //CSIDL_LOCAL_APPDATA
    FOLDERID_ProgramData: KNOWNFOLDERID = '{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}'; //CSIDL_COMMON_APPDATA
    FOLDERID_PuplicDesktop: KNOWNFOLDERID = '{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}'; //CSIDL_COMMON_DESKTOPDIRECTORY
    FOLDERID_Fonts: KNOWNFOLDERID = '{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}'; //CSIDL_FONTS


//******************************************************************************
// fnGetKnownFolderPath --> Get Constant Special Item ID Path from Windows *
// *
// Only for WIN 7 *
// WIN XP has to use fnGetShellFolder in this Unit *
// *
// Parameter --> iCSIDL (Constant Special Item ID) *
// Return --> Boolean True/False *
//******************************************************************************

function fnGetKnownFolderPath(sKnownFolderID : String) : String;

var
sPath : LPWSTR;

begin

  //Set Result
  Result := EmptyStr;

  {$IFDEF VER220}
  If sKnownFolderID = 'FOLDERID_Desktop'        Then SHGetKnownFolderPath(FOLDERID_Desktop,0, 0, sPath);
  If sKnownFolderID = 'FOLDERID_LocalAppData'   Then SHGetKnownFolderPath(FOLDERID_LocalAppData,0, 0, sPath);
  If sKnownFolderID = 'FOLDERID_ProgramData'    Then SHGetKnownFolderPath(FOLDERID_ProgramData,0, 0, sPath);
  If sKnownFolderID = 'FOLDERID_PuplicDesktop'  Then SHGetKnownFolderPath(FOLDERID_PuplicDesktop,0, 0, sPath);
  If sKnownFolderID = 'FOLDERID_Fonts'          Then SHGetKnownFolderPath(FOLDERID_Fonts,0, 0, sPath);
  {$ENDIF}

  //Set Result
  Result := sPath;

end;
Nun hab ich mit der Funktion das folgende Problem...

Wir haben ein Hauptprogramm was das UI darstellt...
Über das UI kann der User diverse Module aufrufen die in DLLs ausgelagert sind (die DLLs werden dynamisch gelinkt)...

Rufe ich die Funktion im Hauptprogramm auf, habe ich kein Problem...
Rufe ich die Funktion aber in einer DLL auf bekomme ich einen Runtime Error 216...

Woran kann das liegen? Ist in der Funktion was falsch Programmiert?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat