Здравствуйте, 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)).
Теперь все ок

. Огромное спасибо всем учавствующим.
Здравствуйте, 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.
Здравствуйте, 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).