Re[10]: #import
От: Николай Украина http://www.nickolya.wallst.ru
Дата: 05.12.02 16:38
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Николай, Вы писали:


Vi2>
S>>    DMIE::IMoveURLPtr obj;
S>>    HRESULT hr = obj.CreateInstance(L"DMIE.IMoveUrl");
Vi2>

Vi2>[]
Vi2>

Н>>говорит,что Invalid class string

Vi2>Правильно говорит. Здесь нужно использовать или ProgID объекта (строка, под которой объект регистрирует себя в Реестре), или CLSID, который скорее всего есть в файле DMIE.tlh (поищи в этом файле слово "coclass", например,
Vi2>
Vi2>struct /* coclass */ Cx;
Vi2>...
Vi2>struct __declspec(uuid("610b38e0-577f-11d6-a449-004095426e66")) Cx;
Vi2>

Vi2>и используй __uuidof(этот класс), т.е. __uuidof(Cx)).

Теперь все ок . Огромное спасибо всем учавствующим.
Re[10]: #import
От: Buran Россия  
Дата: 28.03.06 21:57
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>
S>>    DMIE::IMoveURLPtr obj;
S>>    HRESULT hr = obj.CreateInstance(L"DMIE.IMoveUrl");
Vi2>

Vi2>[]
Vi2>

Н>>говорит,что Invalid class string

Vi2>Правильно говорит. Здесь нужно использовать или ProgID объекта (строка, под которой объект регистрирует себя в Реестре), или CLSID, который скорее всего есть в файле DMIE.tlh (поищи в этом файле слово "coclass", например,
Vi2>
Vi2>struct /* coclass */ Cx;
Vi2>...
Vi2>struct __declspec(uuid("610b38e0-577f-11d6-a449-004095426e66")) Cx;
Vi2>

Vi2>и используй __uuidof(этот класс), т.е. __uuidof(Cx)).

Решил спросить тут, чтобы не создавать отдельную ветку.
У меня примерно такая же проблема. Как же всё-таки составить эту дуратскую class string?
Есть IDL-файл от DLL-ки.
// ServerB.idl : IDL source for ServerB
//
 
// This file will be processed by the MIDL tool to
// produce the type library (ServerB.tlb) and marshalling code.
 
#include "olectl.h"
import "oaidl.idl";
import "ocidl.idl";
 
[
    object,
    uuid(a817e7a2-43fa-11d0-9e44-00aa00b6770a),
    dual,
    helpstring("IComponentRegistrar Interface"),
    pointer_default(unique)
]
interface IComponentRegistrar : IDispatch
{
    [id(1)]    HRESULT Attach([in] BSTR bstrPath);
    [id(2)]    HRESULT RegisterAll();
    [id(3)]    HRESULT UnregisterAll();
    [id(4)]    HRESULT GetComponents([out] SAFEARRAY(BSTR)* pbstrCLSIDs, [out] SAFEARRAY(BSTR)* pbstrDescriptions);
    [id(5)]    HRESULT RegisterComponent([in] BSTR bstrCLSID);
    [id(6)] HRESULT UnregisterComponent([in] BSTR bstrCLSID);
};
 
[
    object,
    uuid(DD16B52D-342C-4AA8-9151-3B071A8A9073),
    dual,
    nonextensible,
    helpstring("IMathB Interface"),
    pointer_default(unique)
]
interface IMathB : IDispatch{
    HRESULT Add( [in] long, [in] long, [out,retval] long* pResult);
};
 
[
    uuid(51427DD1-93DC-4DA0-AA6B-16CC56C59626),
    version(1.0),
    helpstring("ServerB 1.0 Type Library"),
    custom(a817e7a1-43fa-11d0-9e44-00aa00b6770a,"{68D6DC0A-A0A4-43FE-B7D0-99C1667D6C9D}")
]
library ServerBLib
{
    importlib("stdole2.tlb");
 
    [
        uuid(68D6DC0A-A0A4-43FE-B7D0-99C1667D6C9D),
        helpstring("ComponentRegistrar Class")
    ]
    coclass CompReg
    {
        [default] interface IComponentRegistrar;
    };
    [
        uuid(C0D4FE64-8D92-4E4E-963A-0A3947A4737B),
        control,
        helpstring("MathB Class")
    ]
    coclass MathB
    {
        [default] interface IMathB;
    };
};


В реестре вроде написано что ProgID "ServerB.MathB.1"
Тем не менее, вот такой код приводит к ошибке Invalid Class String
#import "..\ServerB\Debug\ServerB.tlb" no_namespace
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    try
    {
      IMathBPtr obj(L"ServerBLib.MathB.1");
      long alpha = obj->Add(123,456);
    }
    catch(_com_error& er)
    {
        printf("_com_error:\n"
               "Error       : %08lX\n"
               "ErrorMessage: %S\n"
               "Description : %S\n"
               "Source      : %S\n",
               er.Error(),
               (LPCTSTR)_bstr_t(er.ErrorMessage()),
               (LPCTSTR)_bstr_t(er.Description()),
               (LPCTSTR)_bstr_t(er.Source()));
    }
    return 0;
}


Можно ли всё-таки как-то составить эту class string.
Re[11]: #import
От: Vi2 Удмуртия http://www.adem.ru
Дата: 29.03.06 07:04
Оценка:
Здравствуйте, Buran, Вы писали:

B>В реестре вроде написано что ProgID "ServerB.MathB.1"

B>Тем не менее, вот такой код приводит к ошибке Invalid Class String
B>#import "..\ServerB\Debug\ServerB.tlb" no_namespace
B>...
B>      IMathBPtr obj(L"ServerBLib.MathB.1");

B>Можно ли всё-таки как-то составить эту class string.

Так ты ее сам уже написал — "В реестре вроде написано что ProgID "ServerB.MathB.1"". Вот и нужно указывать "ServerB.MathB.1".

Дело в том, что эту строку (т.е. ProgID) невозможно получить откуда бы то ни было программным (автоматизированным) способом (разве что перебирав Реестр). ProgID не хранится в библиотеке типов и формируется приложением (или клиентами) самостоятельно. Например, один объект может иметь несколько разных ProgID-ов, дополнительно к версионнозависимым ProgID-ам ("ServerB.MathB" и "ServerB.MathB.1", "ServerB.MathB.2" etc).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[12]: #import
От: Buran Россия  
Дата: 29.03.06 07:45
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Так ты ее сам уже написал — "В реестре вроде написано что ProgID "ServerB.MathB.1"". Вот и нужно указывать "ServerB.MathB.1".


Vi2>Дело в том, что эту строку (т.е. ProgID) невозможно получить откуда бы то ни было программным (автоматизированным) способом (разве что перебирав Реестр). ProgID не хранится в библиотеке типов и формируется приложением (или клиентами) самостоятельно. Например, один объект может иметь несколько разных ProgID-ов, дополнительно к версионнозависимым ProgID-ам ("ServerB.MathB" и "ServerB.MathB.1", "ServerB.MathB.2" etc).


Мда, затупил мощненько. Видимо с 10 утра и до 2-х ночи уже не выдерживаю думать чётко. Спасибо.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.