Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  20:27[Войти] | [Зарегистрироваться]
Ответ на вопрос № 54843

Вопросы с аналогичными сообщениями об ошибках:
  • Access violation at address ... (776)

    27-08-2007 07:10
    Добрый день.
    Есть пустой проект. На форме лежит OpenDialog и баттон. Онклик код баттона такой:
    opendialog1.Execute;
    opendialog1.Execute;
    opendialog1.Execute;
    opendialog1.Execute;

    Больше в проекте никаких компонентов или кода нет. Так вот, иногда при вызове  opendialog1.Execute приложение выдает Access violation, если под отладчиком или просто неожиданно умирает если без него. Иногда (но редко) работает нормально. Что сие может быть и как с этим бороться. У меня Delphi 6, WinXp SP2. Всем спасибо.

    [+] Добавить в избранные вопросы

    Отслеживать ответы на этот вопрос по RSS

    Ответы:


    Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
    Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

    30-01-2008 11:31 | Комментарий к предыдущим ответам
    Спасибо за unit ShellExtFix;

    28-08-2007 11:49
    Решил поступить тупо: просто запретить загрузку всех левых (то есть не от MS) библиотек и вот что получилось:

    unit ShellExtFix;
    interface
    implementation
    uses
      Windows,CommDlg,SysUtils,Dialogs;

    const
      commdlg32='comdlg32.dll';
      kernel32='kernel32.dll';
      ole32='ole32.dll';
      ValidCompanyName='Microsoft Corporation';

    var
      FGetOpenFileNameA:Pointer;
      FGetSaveFileNameA:Pointer;

    {++++++++++++AsmUtils.pas++++++++++++}
    function WriteCode(Addr:Pointer; const Buffer; Size:DWORD):Boolean;
    var
      Writed:DWORD;
    begin
      Result:=WriteProcessMemory(GetCurrentProcess,Addr,@Buffer,Size,Writed)and(Writed=Size);
      FlushInstructionCache(GetCurrentProcess,Addr,Size);
    end;

    function ReadCode(Addr:Pointer; var Buffer; Size:DWORD):Boolean;
    var
      Readed:DWORD;
    begin
      Result:=ReadProcessMemory(GetCurrentProcess,Addr,@Buffer,Size,Readed)and(Readed=Size);
    end;

    function GetImageDirectoryEntryAddr(Module:HMODULE; DirectoryEntry:Word; out ASize:DWORD):Pointer; overload;
    var
      P:Pointer;
      DosHeader:TImageDosHeader;
      NtHeaders:TImageNtHeaders;
    begin
      Result:=nil;
      if DirectoryEntry>=IMAGE_NUMBEROF_DIRECTORY_ENTRIES then Exit;
      P:=Pointer(Module);
      if not ReadCode(P,DosHeader,SizeOf(DosHeader))or(DosHeader.e_magic<>$5A4D) then Exit;
      Inc(PByte(P),DosHeader._lfanew);
      if not ReadCode(P,NtHeaders,SizeOf(NtHeaders)-SizeOf(NtHeaders.OptionalHeader))or(NtHeaders.Signature<>$4550) then Exit;
      with NtHeaders.FileHeader do
        if (SizeOfOptionalHeader<=0)or(SizeOfOptionalHeader>SizeOf(NtHeaders.OptionalHeader)) then Exit;
      Inc(PByte(P),SizeOf(NtHeaders)-SizeOf(NtHeaders.OptionalHeader));
      FillChar(NtHeaders.OptionalHeader,SizeOf(NtHeaders.OptionalHeader),0);
      if not ReadCode(P,NtHeaders.OptionalHeader,NtHeaders.FileHeader.SizeOfOptionalHeader) then Exit;
      if DirectoryEntry>=NtHeaders.OptionalHeader.NumberOfRvaAndSizes then Exit;
      with NtHeaders.OptionalHeader.DataDirectory[DirectoryEntry] do
        if VirtualAddress<>0 then begin
          Result:=Pointer(VirtualAddress+Module);
          ASize:=Size;
        end;
    end;

    function ReplaceImportEntries(Instance:HMODULE; ModuleName:PChar; OldProc,NewProc:Pointer):Integer;
    type
      TIMAGE_IMPORT_DESCRIPTOR=record
        Union:DWORD;
        TimeDateStamp:DWORD;
        ForwarderChain:DWORD;
        Name:DWORD;
        FirstThunk:DWORD;
      end;
    var
      Size:DWORD;
      ppfn:PPointer;
      ImportDesc:^TIMAGE_IMPORT_DESCRIPTOR;
    begin
      Result:=0;
      if (OldProc=nil)or(Instance=0) then Exit;
      ImportDesc:=GetImageDirectoryEntryAddr(Instance,IMAGE_DIRECTORY_ENTRY_IMPORT,Size);
      if ImportDesc=nil then Exit;
      while ImportDesc.Name<>0 do begin
        if (ModuleName=nil)or(lstrcmpi(ModuleName,PChar(Instance+ImportDesc.Name))=0) then begin
          ppfn:=Pointer(Instance+ImportDesc.FirstThunk);
          while ppfn^<>nil do begin
            if (ppfn^=OldProc)and WriteProcessMemory(GetCurrentProcess,ppfn,@NewProc,SizeOf(NewProc),Size)and(Size=SizeOf(NewProc)) then
              Inc(Result);
            Inc(ppfn);
          end;
        end;
        Inc(ImportDesc);
      end;
    end;
    {------------AsmUtils.pas------------}

    function GetVerValue(const FileName,Value:string):string;
    var
      FBuffer:PChar;
      FSize,B:Integer;
      FHandle:DWORD;
      szName:string;
      V:Pointer;
      Len:UINT;
      P:PInteger;
      Buf:array[0..MAX_PATH] of Char;
    begin
      Result:='';
      GetShortPathName(PChar(FileName),@Buf,SizeOf(Buf));
      FSize:=GetFileVersionInfoSize(@Buf,FHandle);
      if FSize>0 then begin
        GetMem(FBuffer,FSize);
        try
          if GetFileVersionInfo(@Buf,FHandle,FSize,FBuffer) then begin
            VerQueryValue(FBuffer,'\VarFileInfo\Translation',Pointer(P),Len);
            B:=MakeLong(HiWord(LongInt(P^)),LoWord(LongInt(P^)));
            szName:='\StringFileInfo\'+IntToHex(B,8)+'\'+Value;
            if VerQueryValue(FBuffer,PChar(szName),V,Len) then begin
              SetString(szName,PChar(V),Len);
              Result:=PChar(szName);
            end;
          end;
        finally
          FreeMem(FBuffer);
        end;
      end;
    end;

    function _LoadLibraryExW(lpFileName:PWideChar; hFile,dwFlags:DWORD):HMODULE; stdcall;
    begin
      if GetVerValue(lpFileName,'CompanyName')=ValidCompanyName then
        Result:=LoadLibraryExW(lpFileName,hFile,dwFlags)
      else begin
        Result:=0;
        SetLastError(ERROR_ACCESS_DENIED);
      end;
    end;

    function SafeCallDialogProc(Proc:Pointer; Param:Pointer):Bool;
    type
      TDialogProc=function(Param:Pointer):Bool; stdcall;
    var
      OleLib:HMODULE;
      LoadLibProc:Pointer;
    begin
      OleLib:=GetModuleHandle(ole32);
      LoadLibProc:=GetProcAddress(GetModuleHandle(kernel32),'LoadLibraryExW');
      ReplaceImportEntries(OleLib,kernel32,LoadLibProc,@_LoadLibraryExW);
      try
        Result:=TDialogProc(Proc)(Param);
      finally
        ReplaceImportEntries(OleLib,kernel32,@_LoadLibraryExW,LoadLibProc);
      end;
    end;

    function _GetOpenFileNameA(Param:Pointer):Bool; stdcall;
    begin
      Result:=SafeCallDialogProc(FGetOpenFileNameA,Param);
    end;

    function _GetSaveFileNameA(Param:Pointer):Bool; stdcall;
    begin
      Result:=SafeCallDialogProc(FGetSaveFileNameA,Param);
    end;

    procedure PatchDialogProcs;
    var
      MainLib,ComDlgLib:HMODULE;
    begin
      MainLib:=FindHInstance(TCommonDialog);
      ComDlgLib:=GetModuleHandle(commdlg32);
      FGetOpenFileNameA:=GetProcAddress(ComDlgLib,'GetOpenFileNameA');
      FGetSaveFileNameA:=GetProcAddress(ComDlgLib,'GetSaveFileNameA');
      ReplaceImportEntries(MainLib,commdlg32,FGetOpenFileNameA,@_GetOpenFileNameA);
      ReplaceImportEntries(MainLib,commdlg32,FGetSaveFileNameA,@_GetSaveFileNameA);
    end;

    initialization
      PatchDialogProcs;
    end.


    28-08-2007 06:51
    Одно плохо, если у клиентов возникнет такая же байда, придется, видимо, к ним тащиться и все чистить.
    Ну если их много, этих клиентов, то может проще будет перехватить в commdlg32.dll (или где там этот диалог сидит) функцию LoadLibrary и фильтровать DLL-ки (точнее ссылки на HKCR, но их несложно в путь к DLL-ке перевести) из "HKLM\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved". Составить список нормальных расширений (ну или наоборот BlackList) и разрешать грузить только их.
    Вот кстати ещё одна утилитка по теме:
    http://www.nirsoft.net/utils/shexview.html

    28-08-2007 02:55
    Это бывает от левых расширений оболочки, запустите autoruns.exe от SysInternals и поубирайте всё лишнее с закладки "Explorer".           
    DRON

    Большое спасибо, помогло. Одно плохо, если у клиентов возникнет такая же байда, придется, видимо, к ним тащиться и все чистить.

    27-08-2007 19:18
    Это бывает от левых расширений оболочки, запустите autoruns.exe от SysInternals и поубирайте всё лишнее с закладки "Explorer".

    27-08-2007 07:30
    В Delphi 7 нормально работает, в 2006 не смотрел. Если  Opendialog1.Options := [ofAllowMultiSelect], или ofAllowMultiSelect установить в True, тогда диалог можно вызывать один раз, можно использовать 4 диалога.

    Добавьте свое cообщение

    Вашe имя:  [Войти]
    Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
    контрольный вопрос:
    Какой месяц идет после марта?
    в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
    Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
    Тип сообщения:
    Текст:
    Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Вопросы с аналогичными сообщениями об ошибках:
  • Access violation at address ... (776)


    Страница избранных вопросов Круглого стола.
  •   
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования