Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: COM/DCOM/ActiveX/ATL/CORBA > Проблема с использованием ActiveX DLL в с++!


Автор: DrBoom 19.1.2008, 13:51
НародЪ, подскажите, что я делаю не так  smile  ? Я создал ActiveX DLL на VBA. Имя: "MyProj.dll". ОбЪект - MyProj; Класс - Plugin, т.е. 
вызывая, скажем в VBA код выглядит так:
Код

 set some=CraeteObject("MyProj.Plugin")


 В этоОй ActiveX есть только методы:

Run()
Option()
Job()
Quit()

(параметров нет и они ниче не возращают!)

================

Вот код файла MyProj.idl в проекте с++, где пытаюсь задействовать эту DLL:
Код

import "oaidl.idl";
import "ocidl.idl";

[
    uuid(37A3AD11-F9CC-11D3-8D3C-0000E8D9FD76),
    version(0.0),
    helpstring("MyProj 0.0 Type Library")
]

library MyProj
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    [
        object,
        uuid(37A3AD1D-F9CC-11D3-8D3C-0000E8D9FD76),
        dual,
        helpstring("MyProj Interface"),
        pointer_default(unique)
    ]
    interface IPlugin : IDispatch
    {
        [id(1)] HRESULT Run();
        [id(2)] HRESULT Option();
        [id(3)] HRESULT Job();
        [id(4)] HRESULT Quit();
    };

    [
        uuid(37A3AD1E-F9CC-11D3-8D3C-0000E8D9FD76),
        helpstring("MyProj Class")
    ]
    coclass Plugin
    {
        [default] interface IPlugin;
    };
};


Вот код файла cpp:

Код

#import "MyProj.dll"

MyProj::Plugin Plugin;

int some()
{
 Plugin.CreateInstance(L"MyProj.Plugin");
 Plugin->Run();
}


Использовал  пример описанный тут: http://www.realcoding.net/article/view/1836 .

Однако компилятор выдает след. Error'ы:
Код

error C2079: 'Plugin' uses undefined struct 'MyProj::Plugin'
error C2228: left of '.CreateInstance' must have class/struct/union
error C2227: left of '->Run' must point to class/struct/union/generic type

Пожалуйста, если есть лучше способ, то подскажите, или что я сделал нитак... smile

Добавлено через 2 минуты и 34 секунды
Использую MS 2005 MVC++.

Автор: jonie 20.1.2008, 15:01
Цитата

(параметров нет и они ниче не возращают!)
должны возращать HRESULT 

погляди в object inspector относительно того что после #import все появилось....

Автор: DrBoom 20.1.2008, 22:44
Цитата(Dr.Boom)
параметров нет и они ниче не возращают!

Цитата(jonie @  20.1.2008,  15:01 Найти цитируемый пост)
должны возращать HRESULT 


Весьма возможно, с с++ я мало работал, а ща, что называется, нужда заставила...
Я говорю, что они не возвращают, относительно VBA, ибо это процедуры sub, а не function.... т.е. по-просту void function!!!

Далее... я так и не понял, что должно появится в проекте и как, ибо этого не было... вот... что делать??? кстати, пытаясь написать 
в файле cpp:
Код

MyProj::PluginPtr Plugin; // как в примере

он выдает мол нет члена класса такого и кучу других error'ов...

Если есть другие, более понятные, более рабочие примеры, скиньте плзЪ, нужно очень задействовать эту DLL!!!!!  smile 

-------------

Даже бубны не помогли=(

Автор: xvr 21.1.2008, 14:31
Цитата(DrBoom @ 19.1.2008,  13:51)
НародЪ, подскажите, что я делаю не так  smile 
Вот код файла cpp:

Код

#import "MyProj.dll"

MyProj::Plugin Plugin;

int some()
{
 Plugin.CreateInstance(L"MyProj.Plugin");
 Plugin->Run();
}



Код

MyProj::PluginPtr Plugin;

Цитата

Использовал  пример описанный тут: http://www.realcoding.net/article/view/1836 .
Читать надо внимательней smile

Автор: DrBoom 21.1.2008, 16:18
xvr, это не ответ на поставленный вопрос, ибо я не отрицаю что где-то ошибился... просто мозгЪ умер, и уже не сображает, мне нужно тыкнуть, гле я и в чем сделел нетак... ибо делал как тама написано!!! И я прошу о помощи... голые слова я тож могу говорить, и я б не приводил код, как пример, если б это делал...
Лучше, еще раз повторю, скажите что я нитак сделал, ибо это единственный пример нашел по использованию ActiveX DLL в с++, и эта статья фигурирует в нескольких цать сайтов... в msdn не нашел примеров, ибо на все языки есть, а на c++ так и написано, ПРИМЕРОВ НЕТ, мол разбирайтесь сами!

Автор: xvr 21.1.2008, 18:40
Цитата(DrBoom @ 21.1.2008,  16:18)
xvr, это не ответ на поставленный вопрос, ибо я не отрицаю что где-то ошибился... 


Это ответ, я написал, что у тебя не так, внимательно смотри мой пост.
Цитата

просто мозгЪ умер, и уже не сображает, мне нужно тыкнуть, гле я и в чем сделел нетак... ибо делал как тама написано!!! 

Не так как написано.
Цитата

И я прошу о помощи... голые слова я тож могу говорить, и я б не приводил код, как пример, если б это делал...

Еще раз повторяю - у тебя в сорце написано:
Код

MyProj::Plugin Plugin;

а должно быть
Код

MyProj::PluginPtr Plugin;


Автор: DrBoom 21.1.2008, 19:02
Цитата(xvr @  21.1.2008,  18:40 Найти цитируемый пост)
а должно быть


Извини, но я повторюсь...  Когда пишу так: 
Цитата(DrBoom @  20.1.2008,  22:44 Найти цитируемый пост)
он выдает мол нет члена класса такого и кучу других error'ов...


---------------

 smile  smile 

Автор: xvr 21.1.2008, 21:10
Цитата(DrBoom @ 21.1.2008,  19:02)
Цитата(xvr @  21.1.2008,  18:40 Найти цитируемый пост)
а должно быть


Извини, но я повторюсь...  Когда пишу так: 
Цитата(DrBoom @  20.1.2008,  22:44 Найти цитируемый пост)
он выдает мол нет члена класса такого и кучу других error'ов...


---------------

 smile  smile

А вот это странно, должно работать. Как именно ругается? И что содержится в файле MyProj.tlh (VS должен был его сгенерировать)?

Да, еще - не PluginPtr а IPluginPtr!

Автор: DrBoom 21.1.2008, 21:35
Цитата(xvr @  21.1.2008,  21:10 Найти цитируемый пост)
IPluginPtr

И так пробывал, он тоже самое пишит, мол member не принадлежит (нету такого в) MyProj... Я уже не наю, что делать, более того, всесто генерации tlh генерирует, я ща не помню так, не со своего компа пишу, но точно заголовочный файл h и файл с, имя которых корявенькое, но содержит "MyProj", и при этом он не включил их в проект, я их попробывал включить, а не ... компилятор еще страшнее начал ругаться, но ошибка с членом не пропадала... я просто в не понятках был... 

Автор: xvr 21.1.2008, 22:02
Цитата(DrBoom @ 21.1.2008,  21:35)
Цитата(xvr @  21.1.2008,  21:10 Найти цитируемый пост)
IPluginPtr

И так пробывал, он тоже самое пишит, мол member не принадлежит (нету такого в) MyProj... Я уже не наю, что делать, более того, всесто генерации tlh генерирует, я ща не помню так, не со своего компа пишу, но точно заголовочный файл h и файл с, имя которых корявенькое, но содержит "MyProj", и при этом он не включил их в проект, я их попробывал включить, а не ... компилятор еще страшнее начал ругаться, но ошибка с членом не пропадала... я просто в не понятках был...

Все страньшн и страньше  smile 
Приатач сюда файлы, которые были сгенерены (только предварительно упакуй их в один архив) - разберемся 

Автор: DrBoom 21.1.2008, 22:05
Без проблем, как до дому добирусь, скорее всего утром, тогда пришлю...

Автор: DrBoom 22.1.2008, 22:31
И так... вотЪ аттач, извиняюсь, что с опозданиемЪ, ибо провайдер мой слегка меня отрубилЪ от инета...

===========================

 И так там следующие файлы:
MyProj.idl
и генерируемые им файлы... текст слегка уже отличен от примера, приведенного выше, но суть и проблема таже... делаю так же по примеру! Генерируемые файлы ни как не похожи на те, что в примере и нигде не содержат, хоть лопни и тресни, "I***Ptr"

Автор: xvr 22.1.2008, 23:16
Цитата(DrBoom @ 22.1.2008,  22:31)
И так... вотЪ аттач, извиняюсь, что с опозданиемЪ, ибо провайдер мой слегка меня отрубилЪ от инета...

===========================

 И так там следующие файлы:
MyProj.idl
и генерируемые им файлы... текст слегка уже отличен от примера, приведенного выше, но суть и проблема таже... делаю так же по примеру! Генерируемые файлы ни как не похожи на те, что в примере и нигде не содержат, хоть лопни и тресни, "I***Ptr"

Сгенерированны совершенно стандартные файлы от .idl (их делает midl, а не директива #import), и делаются они по умолчанию при трансляции *.idl файла, если он был сам по себе включен в проект VS. #import похоже совсем не сработала.
Покажи файл проекта и *.cpp, где был #import

Автор: jonie 22.1.2008, 23:46
накатал пример как это выглядит, думаю разберешься...

смотри в ClassExplorer )

Автор: DrBoom 23.1.2008, 12:14
jonie и xvr, спасибо за помощь, проблема была решена...  smile
В общем в моем прокте почему - то вместо IPluginPtr нуно было писать _PluginPtr, почему так я не понял...  smile  
Однако скомпилилось и заработало...  smile 

------------

Еще раз спасибо, хотя вопросы еще есть и будут, и я думаю вернусь суда...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)