Не срабатывает CoInitialize в DLL

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Не срабатывает CoInitialize в DLL

Сообщение А.Н. » 28.05.2010 17:57:13

Есть DLL, написанная на Delphi.
Реализует оболочку над m$ agent.
Я столкнулся с тем, что, при её использовании, у меня вылетает SEGFAULT в Lazarus.

Затем, обнаружил, что не работает следующая функция:
Код: Выделить всё
//---------------------------------------------------------------------------
function InitChar(): pointer; stdcall;
begin
  Result := nil;
  if (CoInitialize(nil) <> S_OK) then exit;
MessageBox(0, 'InitChar', '', MB_OK); 
  // if (OLEInitialize(nil) <> S_OK) then exit;
  Result := TAgent.Create(nil);
end;
//---------------------------------------------------------------------------
procedure InitDLL(); stdcall;
begin
  if (MSAgents = nil) then MSAgents  := InitChar();
end;
//---------------------------------------------------------------------------


Сообщение не выводится. Очевидно, что не выполняется CoInitialize.
В программе, написанной для проверки этой DLL, на Delphi, всё работает.

В чём проблема? И как её решить?

Добавлено спустя 1 минуту 30 секунд:
Тестовая программка для Delphi примитивна и ничего "лишнего", собственно, не делает:
Код: Выделить всё
program test_agent_dll;

{$APPTYPE CONSOLE}

uses
  SysUtils, dll_exports, dialogs;
var s: shortstring;
    p: pointer;
    dlgAgentOpen: TOpenDialog;
begin
  s := 'good';
  dlgAgentOpen := TOpenDialog.Create(nil);
  if (dlgAgentOpen.Execute) then
    begin
      LoadChar(PChar(dlgAgentOpen.FileName));
      Visibility(true, false);
      Speak(PChar(integer(@s) + sizeof(char)));
    end;
  readln; 
end.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Не срабатывает CoInitialize в DLL

Сообщение А.Н. » 30.05.2010 17:16:20

Неужели никто не знает в чём может быть проблема?

Добавлено спустя 7 часов 2 минуты 58 секунд:
Отвратительная штука...
Всё работает, если инициализация DLL и, соответственно, вызов CoInitialize производится в "пустой" программе c Lazarus.

После включения первого модуля, содержащего форму, ничего не работает.
Поскольку, в секцию инициализации lazarus включает такое:
Код: Выделить всё
initialization
  {$I login_unit.lrs}

login_unit.lrs:
Код: Выделить всё
{ Это - файл ресурсов, автоматически созданный lazarus }

LazarusResources.Add('TfrmLogin','FORMDATA',[
  'TPF0'#9'TfrmLogin'#8'frmLogin'#4'Left'#3'$'#1#6'Height'#3#234#1#3'Top'#3#135
  +#0#5'Width'#3#244#1#13'ActiveControl'#7#10'memoParams'#11'BorderIcons'#11#12
...
]);


По непонятным для меня причинам после этого - не работает.
Если включить модуль, в котором производится инициализация DLL первым в проект, а в его секции инициализации, вызывать InitDLL, всё корректно работает.

Добавлено спустя 10 часов 49 минут 37 секунд:
Теперь не работает LibExit... Видимо, из-за того, что в нём вызывается CoUnitialize.
Но, по крайней мере, этот чёртов помощник загружается и работает.
Может, всё-таки кто-то знает в чём причина таких странностей?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 230

Рейтинг@Mail.ru