Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TOpenPictureDialog затирает DLL, которую использует COM? Ж-)

17K
11 июня 2007 года
DeBUGGeR
10 / / 01.09.2006
Ситуация такая: есть проект (среда Delphi7, язык Object Pascal), в котором используется объект класса TOpenPictureDialog, этот же проект выступает в роли COM-клиента. Этот COM-клиент, использует COM-сервер, а сервер использует некую DLL.
COM-объект создаётся так (всё выполняется в главном потоке):

 
Код:
uses COMNet_TLB; //COMNet_TLB.dcu
...
  II, Net: ITNet;
...
  II := CoTNet.Create;
  II.QueryInterface(ITNet, Net);
  Net.Initialize;


Это происходит при старте программы (событие FormCreate).
Использование этого объекта заключается в вызове одного из его методов:

 
Код:
var
  Img: TBitmap;
...
  Img.Handle := Net.ProcessImage(Img.ReleaseHandle, 0);


ProcessImage — это метод объекта Net. При его вызове используются функции из DLL (которую использует COM-сервер). Эта DLL написана на C++, функции подключаются к серверу следующим образом:

 
Код:
...
implementation
  function Monochrome(InputBitmap: HBITMAP; KFACTOR_PERC: Integer): HBITMAP;
    cdecl; external 'DLLs/ImgProcess.dll';
...


Всё это замечательно работает, при одном условии: если не открывать объект класса TOpenPictureDialog, который используется в этом проекте (Delphi7). Открывается этот диалог следующим образом:

Код:
procedure TMainForm.miSelectFolderClick(Sender: TObject);
var
  CurrentDir: String;
begin
  CurrentDir := GetCurrentDir();
  if OpenDlg.Execute then
  begin
    SetCurrentDir(CurrentDir);
    ...
  end;
end;


Итак, открываем мы этот диалог, нажимаем "Отмена" (Т.е. OpenDlg.Execute = False). И, при следующем использовании Net (COM-объекта) вылетает ошибка:

 
Код:
---------------------------
Debugger Exception Notification
---------------------------
Project CharacterMaker.exe raised exception class EAccessViolation with message 'Access violation at address 10022D20. Read of address 10022D20'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help  
---------------------------


Причём ошибка вылетает при использовании хотя бы одной из функций DLL-ки, которую использует COM-сервер. Т.е. в данном случае, это функция Monochrome.

Предположение такое, что этот объект TOpenPictureDialog'а, при создании, затирает адресное пространство DLL-ки. Но этоже полный бред получается.

В общем, я не знаю как эту проблему решить. Кто-нибудь сталкивался с подобными проблемами?

[color=red]для оформления отрывков кода используй [ code ] [ /code ]. Модератор.[/color]
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог