Доброго времени.
Собственно пытаюсь получить открытые окна проводника. Возникает ошибка при обращении к Item.
Что не так?
Debugger Exception Notification
---------------------------
Project Project4.exe raised exception class $C0000005 with message 'access violation at 0x00c6fd3c: read of address 0x00000000'.
---------------------------
Break Continue Copy Help
---------------------------
uses SHDocVw;
Function GetCurrentExplorerDirectory: String;
var
ShellWindows: IShellWindows;
i: Integer;
h: HWND;
begin
Result := '';
{Explorer - глобальная переменная для доступа ко всем откр.окнам Explorer}
ShellWindows := CoShellWindows.Create;
{Цикл прохода по всем откр.в настоящий момент окнам Explorer}
for i := 0 to ShellWindows.Count - 1 do
{Если очередное окно пребывает сейчас в фокусе}
if GetForegroundWindow = (ShellWindows.Item(i) as IWebbrowser2).HWND then <----------------------------------- ВОТ ТУТ ОШИБКА
begin
{Получаем его Handle (дескриптор окна) }
h := (ShellWindows.Item(i) as IWebbrowser2).HWND;
end;
end;
Здравствуйте, xteam777, Вы писали:
X>Доброго времени. X>Собственно пытаюсь получить открытые окна проводника. Возникает ошибка при обращении к Item. X>Что не так?
Сталкивался с ситуацией, что некоторые давно не получавшие фокуса окна теряют часть GDI-функций (например, захват содержимого), пока снова не появятся в фокусе.
Здравствуйте, xteam777, Вы писали:
X>Project Project4.exe raised exception class $C0000005 with message 'access violation at 0x00c6fd3c: read of address 0x00000000'.
Выглядит, как NULL pointer dereference.
X>
X> if GetForegroundWindow = (ShellWindows.Item(i) as IWebbrowser2).HWND then <----------------------------------- ВОТ ТУТ ОШИБКА
X>
Насколько уж я паскаля не знаю, но тут вроде или ShellWindows может быть NULL, или Item(i) от него, в который ты лезешь за HWND. Вот и проверь их явно. В паскале хоть есть, чем на значение указателя посмотреть?
И еще. А разве в паскале индексация массивов идет от 0, а не от 1?
Здравствуйте, xteam777, Вы писали: X> if GetForegroundWindow = (ShellWindows.Item(i) as IWebbrowser2).HWND then <----------------------------------- ВОТ ТУТ ОШИБКА
Думаю кастинг к IWebbrowser2 неудачный, вынесите ShellWindows.Item(i) as IWebbrowser2 в переменную и проверяйте на nil или как там в дельфи