Проблемы с ActiveX-контролом на форме из DLL
От: Lech March  
Дата: 12.11.02 12:55
Оценка:
Имею задачу — сделать экспорт данных в таблицы Excel, не используя сам MS Office. Причем модуль должен быть сделан в виде dll.
Пытаюсь решить ее таким образом — создаю dll с формой, на которой размещаю компонент TF1Book (являющийся ActiveX'ом), умеющий сохранять свое содержимое в формате Excel'я. Только вот проблема — установка свойств этого компонента, запись данных и т.д. — все работает, а вот вызов некоторых методов, в т.ч. жизненно необходимого мне Write, вызывает ошибку при выполнении — Unknown Interface. Тот же компонент на главной форме приложения работает отлично.

Кто подскажет, в чем проблема и как ее решить?
Re: Проблемы с ActiveX-контролом на форме из DLL
От: Fantasist  
Дата: 13.11.02 07:22
Оценка:
Здравствуйте Lech March, Вы писали:

LM>Кто подскажет, в чем проблема и как ее решить?


Тебе точно надо обеспечить визуализацию?
Без кода тяжело что-то предположить. Самое главное: как объект создается и как используется.
Re[2]: Проблемы с ActiveX-контролом на форме из DLL
От: Lech March  
Дата: 13.11.02 07:38
Оценка:
Приветствую.

F>Тебе точно надо обеспечить визуализацию?

Нет. просто, мне казалось, что использование уже имеющегося в Builder'е компонента будет самым логичным решением. MS Office'а может у клиента и не быть, повторюсь. Так что нужен экспорт в Excel, и все.
F>Без кода тяжело что-то предположить. Самое главное: как объект создается и как используется.

Ну, какой там код... есть dll с формой, на которой компонент TF1Book.
По первой функции, экспортируемой dll вызывается

CoInitialize(NULL);
MyForm = new TMyForm((void*)NULL);
MyForm->Show();

По второй функции, экспортируемой dll вызывается (F1 — компонент TF1Book)

MyForm->F1->Left = 20;
MyForm->F1->MaxCol = 4;
MyForm->F1->MaxRow = 8;
MyForm->F1->Row = 1;
MyForm->F1->Col = 1;
MyForm->F1->Number = 10;
MyForm->F1->Write("e:\\1.xls", F1FileExcel4);

Все строки, за исключением последней, работают. Они проверочные, естественно. Последняя дает unknown interface.

Вот и весь код собственно... Буду признателен за помощь, очень уж не хочется связываться с чужими компонентами.
Re[3]: Проблемы с ActiveX-контролом на форме из DLL
От: Fantasist  
Дата: 13.11.02 19:33
Оценка:
Здравствуйте Lech March, Вы писали:

LM>Приветствую.


F>>Тебе точно надо обеспечить визуализацию?

LM>Нет. просто, мне казалось, что использование уже имеющегося в Builder'е компонента будет самым логичным решением. MS Office'а может у клиента и не быть, повторюсь. Так что нужен экспорт в Excel, и все.

Тогда не нужно использовать форму. Подключаешь модуль VCF1 и создаешь TF1Book динамически. Далее можно не использовать VCL'ный компонент, можно создать объект с помощью
CoCreateInstance и получить нужный интерфейс через QueryInterface. Все GUID описанны в файле VCF1. Можно так-же ипортировать type-library вручную, сделав import type library на файл vcf132.ocx (он где-то у тебя там есть), и посмотреть, не отличаются ли там интерфейсы. Конечно, не должны, но тем не менее, если ничего не работает, проверить можно.
Re[4]: Проблемы с ActiveX-контролом на форме из DLL
От: Fantasist  
Дата: 14.11.02 01:54
Оценка:
Вот даже примерчик наваял, зачем-то. Под настроение. Правда на Delphi, но суть та же.


uses
  SysUtils,
  Classes, ActiveX, ComObj, VCF1;

const
  DLL_PROCESS_DETACH = 0;
  DLL_PROCESS_ATTACH = 1;


procedure MainDll(Reason:Integer);
begin
 if Reason=DLL_PROCESS_ATTACH then
   CoInitialize(nil)
 else
 if Reason=DLL_PROCESS_DETACH then
   CoUninitialize;
end;

function SaveToXls:HRESULT;
var
 ui:IUnknown;
 IBook:_DVCF1;
begin
 Result:=S_OK;
 try
   OleCheck(CoCreateInstance(CLASS_F1Book,nil,CLSCTX_INPROC_SERVER,IUnknown,ui));
   IBook:=ui as _DVCF1; //Тут если в Builder as нету, будет QueryInterface.
   IBook.Col:=1;
   IBook.Row:=1;
   IBook.Number:=300;
   IBook.Col:=2;
   IBook.Row:=2;
   IBook.Text:='My text';
   IBook.Write('c:\1\1.xls', F1FileExcel4);
 except
   on E: EOleSysError do
     Result:=E.ErrorCode;
   else
     Result:=E_UNEXPECTED;
 end;
end;

exports
   SaveToXls;

begin
  DllProc:=MainDll;
  DllProc(DLL_PROCESS_ATTACH);
end.
Re[5]: Проблемы с ActiveX-контролом на форме из DLL
От: Lech March  
Дата: 14.11.02 09:32
Оценка:
Спасибо большое, Fantasist! Обязательно попробую.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.