uses COMNet_TLB; //COMNet_TLB.dcu
...
II, Net: ITNet;
...
II := CoTNet.Create;
II.QueryInterface(ITNet, Net);
Net.Initialize;
TOpenPictureDialog затирает DLL, которую использует COM? Ж-)
COM-объект создаётся так (всё выполняется в главном потоке):
Код:
Это происходит при старте программы (событие FormCreate).
Использование этого объекта заключается в вызове одного из его методов:
Код:
var
Img: TBitmap;
...
Img.Handle := Net.ProcessImage(Img.ReleaseHandle, 0);
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';
...
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;
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
---------------------------
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]