Имею задачу — сделать экспорт данных в таблицы Excel, не используя сам MS Office. Причем модуль должен быть сделан в виде dll.
Пытаюсь решить ее таким образом — создаю dll с формой, на которой размещаю компонент TF1Book (являющийся ActiveX'ом), умеющий сохранять свое содержимое в формате Excel'я. Только вот проблема — установка свойств этого компонента, запись данных и т.д. — все работает, а вот вызов некоторых методов, в т.ч. жизненно необходимого мне Write, вызывает ошибку при выполнении — Unknown Interface. Тот же компонент на главной форме приложения работает отлично.
Приветствую.
F>Тебе точно надо обеспечить визуализацию?
Нет. просто, мне казалось, что использование уже имеющегося в Builder'е компонента будет самым логичным решением. MS Office'а может у клиента и не быть, повторюсь. Так что нужен экспорт в Excel, и все. F>Без кода тяжело что-то предположить. Самое главное: как объект создается и как используется.
Ну, какой там код... есть dll с формой, на которой компонент TF1Book.
По первой функции, экспортируемой dll вызывается
CoInitialize(NULL);
MyForm = new TMyForm((void*)NULL);
MyForm->Show();
По второй функции, экспортируемой dll вызывается (F1 — компонент TF1Book)
Здравствуйте 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
Вот даже примерчик наваял, зачем-то. Под настроение. Правда на 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