Можно изменить способ, которым повреждается Visual Studio, когда исключение происходит. По умолчанию это повреждается на необработанных исключениях. Если Вы переходите к меню Debug> Exceptions, можно снять флажок с Исключениями Общеязыковой среды выполнения и внести другие изменения в поведении IDE, когда исключения происходят. Например, у Вас может быть он повреждение только на одном виде исключения; там существует длинный список.
я сделал это в редких случаях при попытке отладить.
Для 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 \
. Возможно, в разных языковых версиях 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 \
. Возможно, в разных языковых версиях 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 \
. Возможно, в разных языковых версиях 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 \
. Возможно, в разных языковых версиях 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 \
. Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных.
"C: \ Documents and Settings \ \ Application Data \"
. Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных. Имейте в виду, что вы должны использовать эти функции и для ваших пользовательских данных, а не для жестко заданных значений, таких как "C: \ Documents and Settings \ \ Application Data \"
. Возможно, в разных языковых версиях Windows используются разные имена каталогов или пользователи могут свободно перемещать свои области данных. Я бы рекомендовал использовать библиотеку кода JEDI с открытым исходным кодом для такого рода вещей.
В JclShell.pas вы найдете GetSpecialFolderLocation ()
YourDataFolder := GetSpecialFolderLocation(CSIDL_COMMON_APPDATA);
Это бесплатно, хорошо протестировано, работает со всеми версиями Windows, и его использование защитит вас от будущих изменений в Windows API.