Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 При простом подключении dll, возникает ошибка  [new]
Sergey-2008
Member

Откуда:
Сообщений: 128
Доброе время суток форумчане.
У меня есть dll, которая работает с Microsoft Word – все нормально, т.е.:

1 запускаю программу (в delphi)
2 открывается файл word
3 он сохраняется под другим названием и открывается
4 закрываете word
5 закрываю программу

Как только я, просто подключил в dll, новый модуль «Vcl.DBGrids;», но не использую пока его (он мне будет в дальнейшем нужен) и проделываю операции описанные выше, то при закрытии программы (в режиме отладки), выпадает ошибка:
Debugger Fault Notification
---------------------------
Project D:\Prog\_Example\Example application\PEx_application.exe faulted with message: 'system exception (code 0xc000000d) at 0x77417fdc'. Process Stopped. Use Step or Run to continue.

Заранее спасибо за ответ
30 дек 18, 16:45    [21776950]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
Sergey-2008
Как только я, просто подключил в dll, новый модуль «Vcl.DBGrids;»
Просто не повезло. Вернее, раньше везло.
Ты что-то в all не освобождаешь корректно.
30 дек 18, 17:19    [21776961]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
Sergey-2008
Member

Откуда:
Сообщений: 128
YuRock
Ты что-то в all не освобождаешь корректно.

А как понять, что нужно освободить? до этого всеж было норм.
30 дек 18, 18:14    [21776978]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
Sergey-2008
YuRock
Ты что-то в all не освобождаешь корректно.

А как понять, что нужно освободить? до этого всеж было норм.
Найти ошибки в коде.
30 дек 18, 18:43    [21776981]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
Sergey-2008
Member

Откуда:
Сообщений: 128
Вот те строки, которые используются в dll
uses
  UFile_Action, ComObj, IBX.IBCustomDataSet, ShellAPI,
  Activex, Vcl.DBGrids;

implementation

function CreateWord: boolean;
//create word application
begin
  CreateWord := true;
  try
    Words_Templs := CreateOleObject('Word.Application');
  except
    begin
//      showmessage('Пакет Microsoft Office не найден');
  //    Application.MessageBox('', 'Warning', MB_OK+MB_ICONEXCLAMATION);
      CreateWord := false;
    end;
  end;
End;

function Open_Doc_Template(APath_file: string): boolean;
//open template file
var
  LDoc: variant;
begin
  CoInitialize(Nil);
CreateWord;
  Open_Doc_Template := true;
  try
    LDoc := Words_Templs.Documents;
    LDoc.Open(APath_file);
  except
    Open_Doc_Template := false;
  end;
  CoUninitialize;
End;

exports
  Open_Doc_Template;


но тут все что создается из com, это объект word,
его я включил в "CoInitialize(Nil);" и "CoUninitialize"
30 дек 18, 20:03    [21777001]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
Sergey-2008,

Ну вот. Где освобождение Words_Templs перед выгрузкой dll?
30 дек 18, 20:06    [21777002]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47083

Прелестно: ты собственными руками убиваешь СОМ во время работы СОМ-сервера. Какой
вредитель тебя этому научил?

Posted via ActualForum NNTP Server 1.5

30 дек 18, 20:08    [21777003]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
Соколинский Борис
Member

Откуда: Москва
Сообщений: 9271
Sergey-2008,
Проверяй результат Coinitialize() - так определишь, нужно ли финализировать.
30 дек 18, 20:17    [21777005]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
Sergey-2008
Member

Откуда:
Сообщений: 128
YuRock,

Да, действительно, забыл сделать
Words_Templs := Unassigned;

ошибка ушла
30 дек 18, 20:32    [21777010]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
Sergey-2008
Member

Откуда:
Сообщений: 128
и впоследствии, все получилось вот так:
создание объекта с "CoInitialize(Nil)";

function CreateWord: boolean;
//create word application
begin
  CoInitialize(Nil);
  CreateWord := true;
  try
    Words_Templs := CreateOleObject('Word.Application');
  except
    begin
      showmessage('Пакет Microsoft Office не найден');
      CreateWord := false;
    end;
  end;
End;


работа с ним
и разрушение с "Unassigned" и "CoUninitialize;"

function SaveDocAs(ANamePath, ANameFile: string; AOpenDoc: integer):boolean; export;
//save created doc
{
LOpenDoc
  0 - not open created doc
  1 - open created doc
}
var
  LPath: string;
begin
  SaveDocAs := true;
  try
    begin
      Words_Templs.ActiveDocument.SaveAs(ANamePath+'result_doc.rtf');
      CloseDoc;
      Close_Document(0);
      if AOpenDoc = 1 then
        OPEN_MAKE_DOC(ANamePath, 'result_doc.rtf', '', 0, LPath);
      Words_Templs := Unassigned;
      CoUninitialize;
    end;
  except
    SaveDocAs := false;
  end;
end;
30 дек 18, 20:46    [21777013]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
alekcvp
Member

Откуда:
Сообщений: 1279
Sergey-2008,

Может CoUninitialize; всё же после секции except поставить?..
31 дек 18, 04:24    [21777076]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3825
alekcvp
Sergey-2008,

Может CoUninitialize; всё же после секции except поставить?..
Да их вообще надо ставить в начале и в конце потока.
Если главный поток - вопще не надо (дельфя сама их вызывает).
31 дек 18, 16:32    [21777159]     Ответить | Цитировать Сообщить модератору
 Re: При простом подключении dll, возникает ошибка  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10777
Соколинский Борис
Проверяй результат Coinitialize() - так определишь, нужно ли финализировать.
https://docs.microsoft.com/en-us/windows/desktop/api/combaseapi/nf-combaseapi-couninitialize
A thread must call CoUninitialize once for each successful call it has made to the CoInitialize or CoInitializeEx function, including any call that returns S_FALSE.
Так что
OleCheck(CoInitialize(nil));
достаточно. И не нужно никаких проверок
8 янв 19, 17:31    [21780009]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить