Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как передать структуру из COM DLL в проект на C#? 
:(
    Опции темы
Elfet
Дата 15.5.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Всем привет! 

Тут такое дело, не овсем понимаю как это в COM делается. Подскажите, пожалуйста!

У меня есть COM объект в котором есть:
SFC.idl
Код

[
    object,
    uuid(36DB3307-8AE2-41FF-B2D8-C23F1B94C5FF),
    dual,
    nonextensible,
    helpstring("ISolver Interface"),
    pointer_default(unique)
]
interface ISolver : IDispatch
{
    HRESULT Init();
    HRESULT ImportFromFluent2D([in] BSTR filename);
    HRESULT GetErrorMsg([out] BSTR *error);
    HRESULT GetRender([out] Node *nodes);
};

[
    uuid(9EFB9853-4F4C-4A0E-A60C-9A83F30FA894),
    version(1.0),
    helpstring("SFC 1.0 Type Library"),
    custom(a817e7a1-43fa-11d0-9e44-00aa00b6770a,"{B9E38963-B0B3-4AE6-BC79-625D4BAAFE62}")
]
library SFCLib
{
    importlib("stdole2.tlb");

    [
        uuid(B9E38963-B0B3-4AE6-BC79-625D4BAAFE62),
        helpstring("ComponentRegistrar Class")
    ]
    coclass CompReg
    {
        [default] interface IComponentRegistrar;
    };
    [
        uuid(D7378215-894B-4D9B-9380-2126E9D59571),
        helpstring("Solver Class")
    ]
    coclass Solver
    {
        [default] interface ISolver;
    };
};



ругается вот на это: HRESULT GetRender([out] Node *nodes); на Node

Node это вот этот простой класс:
Код

class Node
{
public:
    double x, y, z;
    Node(void);
    Node(double x, double y, double z);
    Node(double x, double y);
    ~Node(void);
};


Массив этих Node хранится в CSolver-e:
Код

// CSolver

class ATL_NO_VTABLE CSolver :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CSolver, &CLSID_Solver>,
    public IDispatchImpl<ISolver, &IID_ISolver, &LIBID_SFCLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CSolver()
        : solver(NULL)
    {
    }
...

public:
    HRESULT __stdcall Init();
    HRESULT __stdcall ImportFromFluent2D(BSTR filename);
    HRESULT __stdcall GetErrorMsg(BSTR *error);
    HRESULT __stdcall GetRender(Node * nodes);
private:
      vector<Node*> *nodes;
};


А в C# мне нужно получить массив этих узлов Node. 
Я понимаю что нужно как-то в library SFCLib включить информацию о Node. Или возможно сделать какой-то интерфейс для Node (тоже не понимаю как).

Заранее спасибо за помощь!


--------------------
PM MAIL WWW Skype   Вверх
Rififi
Дата 15.5.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 1
Всего: 36



классы не являются com-совместимыми объектами, так что никак.

Это сообщение отредактировал(а) Rififi - 15.5.2009, 19:47
PM MAIL   Вверх
Elfet
Дата 15.5.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Так как мне поступать если нужно передать такую информацию: массив точек(Node/узел), ребра, и элементы(вершины его, рёбра его, соседи его)?


--------------------
PM MAIL WWW Skype   Вверх
xvr
Дата 18.5.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Добавь свой Node (но только в виде структуры) в начало idl файла:
Код

struct Node_t
{
    double x, y, z;
};

...
    HRESULT GetRender([out] Node_t *nodes);
...

В .h добавь 
Код

class Node : public Node_t
{
public:
    Node(void);
    Node(double x, double y, double z);
    Node(double x, double y);
    ~Node(void);
};

А вот как это потом будет использоваться в C# я не знаю  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0430 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.