Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Import *.tlb - как потом использовать полученный *.h ? (C++ Builder 2009)

Ответить
Настройки темы
C/C++ - Import *.tlb - как потом использовать полученный *.h ? (C++ Builder 2009)

Аватара для Sanchos

Пользователь


Сообщения: 124
Благодарности: 5

Профиль | Отправить PM | Цитировать


Нужно подключить tlb файл от CorelDRAW, чтобы управлять корелом из С++ приложения...
Импортнул этот tlb и получил файлыЖ
VGCore_OCX.dcr
VGCore_TLB.cpp
VGCore_TLB.h

Вставил в проект, добавил #include "VGCore_TLB.h", а как дальше использовать, нехватает мозгов
Нужно как то подключится к IID_IVGApplication

В VGCore_TLB.cpp есть:

Код: Выделить весь код
namespace Vgcore_tlb
{
....
const GUID IID_IVGApplication = {0xB058000B, 0x9AA4, 0x44FD,{ 0x95, 0x47, 0x4F,0x91, 0xEB, 0x75,0x7A, 0xC4} };
....
}
В VGCore_TLB.h:

Код: Выделить весь код
namespace Vgcore_tlb
{
...
extern __declspec (package) const GUID IID_IVGApplication;
...
interface DECLSPEC_UUID("{B058000B-9AA4-44FD-9547-4F91EB757AC4}") IVGApplication;
typedef TComInterface<IVGApplication, &IID_IVGApplication> IVGApplicationPtr;
...
}
Есть у кого какие мысли по этому поводу?
Зарание благодарен.

Отправлено: 21:36, 13-06-2009

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


дальше создаёшь объект (не забудь CoInitialize) при помощи функции CoCreateInstance и используешь его. Вот вырезка из моей самописной библиотеки, адаптированная для твоего кода:
Код: Выделить весь код
void Variant::check(HRESULT hr)
{
    if (hr)
    {
        char *ddstr;
        FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
            0, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*) &ddstr, 0, 0);

        std::string result(ddstr);
        LocalFree(ddstr);

        throw std::runtime_error(result);
    }
}

Variant Variant::createObject(CLSID& clsid)
{
    IDispatch* disp = 0;

    for(;;)
    {
        unsigned hr = CoCreateInstance(clsid, 0,
            CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,
            IID_IDispatch, &(void*)disp);

        if (hr!=0x800401F0) // если вызван CoInitialize()
        {
            check(hr);
            break;
        }

        CoInitialize(0);
    }

    return Variant(disp);
}
Потом используешь интерфейс IDispatch чтобы управлять кодом на макроязыке.
dispatchbot.h
Код: Выделить весь код
#ifndef coobjectH
#define coobjectH
#include <variant.h>
#include <strings.h>
#include <memory>
#include <string>
#include <vector>
//------------------------------------------

class DispatchBot
{
    IDispatch* fdisp;
    mutable Variant fresult;
    std::vector<Variant> fargs;
    std::vector<std::wstring> fnames;
    mutable std::vector<DISPID> fdispids;

    void resetArgs();
    void compile() const;
    void invoke(int) const;

public:
    DispatchBot();
    ~DispatchBot();

    DispatchBot& addArg(const Variant&);
    DispatchBot& addNamedArg(const std::wstring& w, const Variant&);
    DispatchBot& member(Variant& obj, const std::wstring&);
    DispatchBot& member(const std::wstring&);
    void put(const Variant& v);
    void execute();
    Variant& oleArg(int n);
    Variant& get();

    DispatchBot& operator()(const Variant& v) {return addArg(v);}
    DispatchBot& operator()(const std::wstring& w, const Variant& v) {return addNamedArg(w, v);}
    DispatchBot& operator[](const std::wstring& w) {return member(w);}
    Variant& operator*() {return get();}
    Variant& operator()() {execute();return fresult;}
    void operator=(const Variant& v) {put(v);}
};
//------------------------------------------
#endif
dispatchbot.cpp
Код: Выделить весь код
#include <dispatchbot.h>
#include <sstream>
/*-----------------29.03.2006 23:00-----------------
 * Класс для работы с IDispatch (ActiveX)

    DispatchBot bot;
    result = bot.member(object1, L"Method")();   // запуск метода
    result = *bot.member(object1, L"Property");  // взятие свойства
    bot.member(object1, L"Property") = value;    // изменение свойства
    bot.member(object1, L"Class1")[L"Class2"][L"Class3"]...  // движение по вложенным агрегатам
    bot.member(object1, L"Method_or_property")(value1)(value2)...  // аргументы
    bot.member(object1, L"Method_or_property")(L"Name1", value1)(L"Name1", value2)...  // аргументы с именем

 * можно действовать вперемешку.
 * --------------------------------------------------*/

DispatchBot::DispatchBot() :
    fdisp()
{
}

DispatchBot::~DispatchBot()
{
    if (fdisp) fdisp->Release();
}

Variant& DispatchBot::oleArg(int n)
{
    return fargs.at(n);
}

DispatchBot& DispatchBot::addArg(const Variant& v)
{
    std::vector<Variant>::iterator a = fargs.begin();
    std::advance(a, fnames.size()-1);
    fargs.insert(a, v);
    return *this;
}

DispatchBot& DispatchBot::addNamedArg(const std::wstring& w, const Variant& v)
{
    addArg(v);
    fnames.push_back(w);
    return *this;
}

void DispatchBot::compile() const
{
    // аргументы хранятся в args в следующем порядке:
    // сначала поименованные, затем по порядку.
    // в векторе fnames сначала идёт имя класса-агрегата,
    // свойства или метода, затем имена аргументов.
    // Таким образом, имён на 1 больше, чем именованных аргументов.

    if (fdispids.empty()) // not empty when compiled
    {
        fdispids.resize(fnames.size());

        // аргумент для IDispatch::GetIDsOfNames()
        std::vector<const wchar_t*> wt;
        wt.reserve(fnames.size());
        for (unsigned i=0; i<fnames.size(); i++) wt.push_back(fnames[i].c_str());

        Variant::check(fdisp->GetIDsOfNames(IID_NULL, const_cast<wchar_t**>(&wt[0]),
                wt.size(), LOCALE_SYSTEM_DEFAULT, &fdispids[0]));
    }
}

void DispatchBot::invoke(int action) const
{
    // запуск и сообщение об ошибке

    DISPPARAMS params;
    EXCEPINFO exceptn;
    unsigned err_arg;

    params.cArgs           = fargs.size();
    params.rgvarg          = (VARIANT*)&fargs[0];
    params.cNamedArgs      = fdispids.size()-1;
    params.rgdispidNamedArgs = &fdispids[1];

    // были проблемы, если не сбрасывать результат.
    fresult.reset();

    if (fdisp->Invoke(fdispids[0], IID_NULL, LOCALE_USER_DEFAULT,
                    action, ¶ms, (VARIANT*)&fresult, &exceptn, &err_arg))
    {
        std::stringstream errmsg;

        const char* str_action;
        switch (action)
        {
            case DISPATCH_METHOD: str_action = "exec"; break;
            case DISPATCH_PROPERTYGET: str_action = "get"; break;
            case DISPATCH_PROPERTYPUT: str_action = "put"; break;
            default: str_action = "combined action";
        }

        errmsg << "DispatchBot::invoke " << str_action << " \"" << narrow(fnames[0])
                << "\" arg #" << err_arg << "\n"
                << narrow(exceptn.bstrSource) << ": "
                << narrow(exceptn.bstrDescription);

        throw std::runtime_error(errmsg.str());
    }
}

DispatchBot& DispatchBot::member(Variant& obj, const std::wstring& w)
{
    fargs.clear();
    fnames.clear();
    fdispids.clear();

    IDispatch* disp = obj.asDispatch();
    if (!disp) throw std::invalid_argument("DispatchBot::member not an object");

    disp->AddRef();
    if (fdisp) fdisp->Release();
    fdisp = disp;

    fnames.push_back(w);
    return *this;
}

DispatchBot& DispatchBot::member(const std::wstring& w)
{
    if (!fnames.empty())
    {
        get();
    }

    return member(fresult, w);
}

Variant& DispatchBot::get()
{
    compile();
    invoke(DISPATCH_PROPERTYGET);
    return fresult;
}

void DispatchBot::put(const Variant& v)
{
    struct restore_t
    {
        std::vector<Variant>& v1;
        std::vector<DISPID>& v2;

        restore_t(std::vector<Variant>& a1, std::vector<DISPID>& a2) : v1(a1), v2(a2) {}

        ~restore_t()
        {
            v1.pop_back();
            v2.pop_back();
        }
    };

    compile();
    // add named "put" argument
    fdispids.push_back(DISPID_PROPERTYPUT);
    addArg(v);

    restore_t restore(fargs, fdispids);
    invoke(DISPATCH_PROPERTYPUT);
}

void DispatchBot::execute()
{
    compile();
    invoke(DISPATCH_METHOD);
}

Отправлено: 11:29, 23-06-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Import *.tlb - как потом использовать полученный *.h ? (C++ Builder 2009)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - [С++ Builder 2009] Проблемы с созданием пользователей (наверно все дело в строках) crashtuak Программирование и базы данных 1 05-07-2009 22:58
Доступ - [решено] Растёт время отклика от сервера, потом он недоступен, а потом снова нормальный пинг Lesta Microsoft Windows 2000/XP 9 19-06-2009 13:38
C/C++ - [ С++ Builder 2009 ] Управление сетевыми подключениями crashtuak Программирование и базы данных 1 11-06-2009 08:26
C/C++ - [C++Builder 2009] TTreeView crashtuak Программирование и базы данных 4 21-04-2009 07:10
C/C++ - [C++Builder 2009] Форма по png файлу с альфа каналом (есть пример на дельфи) crashtuak Программирование и базы данных 9 16-04-2009 08:30




 
Переход