Где сохранить ini зависимого файла к машине (не пользователь) на окнах

Можно изменить способ, которым повреждается Visual Studio, когда исключение происходит. По умолчанию это повреждается на необработанных исключениях. Если Вы переходите к меню Debug> Exceptions, можно снять флажок с Исключениями Общеязыковой среды выполнения и внести другие изменения в поведении IDE, когда исключения происходят. Например, у Вас может быть он повреждение только на одном виде исключения; там существует длинный список.

я сделал это в редких случаях при попытке отладить.

5
задан Toby Allen 8 July 2012 в 08:50
поделиться

2 ответа

Для XP Windows предоставляет SHGetFolderPath () для получения известного местоположения. CSIDL, который вы ищете, - это CSIDL_COMMON_APPDATA , описываемый как:

Каталог файловой системы, содержащий данные приложения для всех пользователей. Типичный путь - «C: \ Documents and Settings \ All Users \ Application Data» . Эта папка используется для данных приложения, не зависящих от пользователя. Например, приложение может хранить словарь проверки орфографии, базу данных клипартов или файл журнала в папке CSIDL_COMMON_APPDATA . Эта информация не будет перемещаться и доступна любому, кто использует компьютер.

Для Vista и более поздних версий она была заменена на SHGetKnownFolderPath () , хотя SHGetFolderPath () по-прежнему доступна как функция оболочки для этого. Если вы используете настоящий вызов Vista, вам следует использовать FOLDERID_ProgramData вместо CSIDL_COMMON_APPDATA .

Эта ссылка здесь , кажется, показывает способ сделать это.

Похоже, что все сводится к следующему (относитесь к этому осторожно, я не так хорошо знаю Delphi):

function ShGetKnownFolderPath (
    const rfid:   TGUID;
    dwFlags:      DWord;
    hToken:       THandle;
    out ppszPath: PWideChar): HResult;
var
    Shell: HModule;
    Fn: TShGetKnownFolderPath;
begin
    Shell := LoadLibrary ('shell32.dll');
    Win32Check(Shell <> 0);
    try
        @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
        Win32Check (Assigned (Fn));
        Result := Fn (rfid, dwFlags, hToken, ppszPath);
    finally
        FreeLibrary (Shell);
    end;
end;

function GetKnownFolderPath (
    const rfid: TGUID;
    dwFlags:    DWord;
    hToken:     THandle): WideString;
var
    buffer: PWideChar;
    ret: HResult;
begin
    ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
    OleCheck (ret);
    try
        Result := buffer;
    finally
        CoTaskMemFree (buffer);
    end;
end;

На этой странице содержится список всех CSIDL _ * и значения FOLDERID _ * . Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \" . Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.

вам следует использовать FOLDERID_ProgramData вместо CSIDL_COMMON_APPDATA .

Эта ссылка здесь , кажется, показывает способ сделать это.

Кажется, все сводится к это (относитесь к этому осторожно, я не очень хорошо знаю Delphi):

function ShGetKnownFolderPath (
    const rfid:   TGUID;
    dwFlags:      DWord;
    hToken:       THandle;
    out ppszPath: PWideChar): HResult;
var
    Shell: HModule;
    Fn: TShGetKnownFolderPath;
begin
    Shell := LoadLibrary ('shell32.dll');
    Win32Check(Shell <> 0);
    try
        @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
        Win32Check (Assigned (Fn));
        Result := Fn (rfid, dwFlags, hToken, ppszPath);
    finally
        FreeLibrary (Shell);
    end;
end;

function GetKnownFolderPath (
    const rfid: TGUID;
    dwFlags:    DWord;
    hToken:     THandle): WideString;
var
    buffer: PWideChar;
    ret: HResult;
begin
    ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
    OleCheck (ret);
    try
        Result := buffer;
    finally
        CoTaskMemFree (buffer);
    end;
end;

На этой странице содержится список всех CSIDL _ * и FOLDERID _ * ценности. Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \" . Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.

вам следует использовать FOLDERID_ProgramData вместо CSIDL_COMMON_APPDATA .

Эта ссылка здесь , кажется, показывает способ сделать это.

Кажется, все сводится к это (относитесь к этому осторожно, я не очень хорошо знаю Delphi):

function ShGetKnownFolderPath (
    const rfid:   TGUID;
    dwFlags:      DWord;
    hToken:       THandle;
    out ppszPath: PWideChar): HResult;
var
    Shell: HModule;
    Fn: TShGetKnownFolderPath;
begin
    Shell := LoadLibrary ('shell32.dll');
    Win32Check(Shell <> 0);
    try
        @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
        Win32Check (Assigned (Fn));
        Result := Fn (rfid, dwFlags, hToken, ppszPath);
    finally
        FreeLibrary (Shell);
    end;
end;

function GetKnownFolderPath (
    const rfid: TGUID;
    dwFlags:    DWord;
    hToken:     THandle): WideString;
var
    buffer: PWideChar;
    ret: HResult;
begin
    ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
    OleCheck (ret);
    try
        Result := buffer;
    finally
        CoTaskMemFree (buffer);
    end;
end;

Эта страница предоставляет список всех CSIDL _ * и FOLDERID _ * ценности. Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \" . Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.

Похоже, все сводится к следующему (относитесь к этому осторожно, я не очень хорошо знаю Delphi):

function ShGetKnownFolderPath (
    const rfid:   TGUID;
    dwFlags:      DWord;
    hToken:       THandle;
    out ppszPath: PWideChar): HResult;
var
    Shell: HModule;
    Fn: TShGetKnownFolderPath;
begin
    Shell := LoadLibrary ('shell32.dll');
    Win32Check(Shell <> 0);
    try
        @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
        Win32Check (Assigned (Fn));
        Result := Fn (rfid, dwFlags, hToken, ppszPath);
    finally
        FreeLibrary (Shell);
    end;
end;

function GetKnownFolderPath (
    const rfid: TGUID;
    dwFlags:    DWord;
    hToken:     THandle): WideString;
var
    buffer: PWideChar;
    ret: HResult;
begin
    ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
    OleCheck (ret);
    try
        Result := buffer;
    finally
        CoTaskMemFree (buffer);
    end;
end;

На этой странице содержится список всех CSIDL _ * и FOLDERID _ * значения. Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \" . Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.

Похоже, все сводится к следующему (относитесь к этому осторожно, я не очень хорошо знаю Delphi):

function ShGetKnownFolderPath (
    const rfid:   TGUID;
    dwFlags:      DWord;
    hToken:       THandle;
    out ppszPath: PWideChar): HResult;
var
    Shell: HModule;
    Fn: TShGetKnownFolderPath;
begin
    Shell := LoadLibrary ('shell32.dll');
    Win32Check(Shell <> 0);
    try
        @Fn := GetProcAddress (Shell, 'SHGetKnownFolderPath');
        Win32Check (Assigned (Fn));
        Result := Fn (rfid, dwFlags, hToken, ppszPath);
    finally
        FreeLibrary (Shell);
    end;
end;

function GetKnownFolderPath (
    const rfid: TGUID;
    dwFlags:    DWord;
    hToken:     THandle): WideString;
var
    buffer: PWideChar;
    ret: HResult;
begin
    ret :=ShGetKnownFolderPath (rfid, dwFlags, hToken, buffer);
    OleCheck (ret);
    try
        Result := buffer;
    finally
        CoTaskMemFree (buffer);
    end;
end;

На этой странице содержится список всех CSIDL _ * и FOLDERID _ * значения. Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \" . Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.

Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \" . Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.

Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \" . Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.

12
ответ дан 18 December 2019 в 09:08
поделиться

Я бы рекомендовал использовать библиотеку кода JEDI с открытым исходным кодом для такого рода вещей.

В JclShell.pas вы найдете GetSpecialFolderLocation ()

YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA);

Это бесплатно, хорошо протестировано, работает со всеми версиями Windows, и его использование защитит вас от будущих изменений в Windows API.

6
ответ дан 18 December 2019 в 09:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: