为什么总是提示类未注册?
我有一个OCX控件。在实现一个服务器的过程中要用到控件中的某些功能,服务器不能使用mfc,
现在有两个问题:
1)在我注册了控件之后,在一个非mfc项目中使用智能指针实例化该控件的一个接口,不成功。请看如下代码:
if(CoInitialize(NULL)==S_OK)
{
printf("Initializes the COM library successfully.\n");
}
HRESULT nRet;
_DESPPtr pApp;
try
{
nRet=pApp.CreateInstance(__uuidof(_DESP));
}
catch(_com_error e)
{
printf("%s\n",e.ErrorMessage());
}
if(pApp)
{
pApp->CbPort=3000;
pApp->CbServerName="139.24.254.12";
if(pApp->Connect())
{
printf("connect ok.\n");
}
else
{
printf("connect false.\n");
}
}
CoUninitialize();
2)如何处理控件的事件?(这当然是在第一个已经成功的基础上)
请高手指点!!!
问题点数:0、回复次数:8Top
1 楼zhushizu(从来就没有救世祖)回复于 2004-09-01 13:30:50 得分 0
是呀,我也是想了好久。。关注中。。。Top
2 楼impossible()回复于 2004-09-01 13:48:46 得分 0
CreateInstance成功了吗?如果成功了,那我不知道为何?
如果没成功,那还是注册出现错误,组件需要licence吗?
第二个问题你看一下联结点,链接点容器,出接口Top
3 楼nokialiu(一笑而过)回复于 2004-09-01 14:45:45 得分 0
就是CreateInstance返回“类未注册”错误。
注册没有出现错误,而且也不需要license.
好郁闷,希望大家一起关注...Top
4 楼skyxie(黑白精灵)回复于 2004-09-02 00:10:31 得分 0
就是CreateInstance返回“类未注册”错误。
______________________________________
你注册该ocx了吗?
在命令行中输入regsvr32.exe path_name_of_your_ocx.ocx注册该ocx
或者写代码调用该ocx的DllRegiserServer函数注册Top
5 楼skyxie(黑白精灵)回复于 2004-09-02 00:53:40 得分 0
这样试试呢
HRESULT nRet;
CLSID clsID;
HRESULT hr;
hr= CLSIDFromProgID(OLESTR("YourSvr._DESP"), &clsID);
if(FAILED(hr))
{
AfxMessageBox("Retrieval of ProgID failed");
return FALSE;
}
_DESPPtr pApp;
try
{
nRet=pApp.CreateInstance( clsID );
}Top
6 楼Cline(营营[无意苦争春,贯看群芳谢])回复于 2004-09-02 15:16:35 得分 0
"nRet=pApp.CreateInstance(__uuidof(_DESP)); "
可能你的_DESP是一个接口,你传了一人接口的ID. 这儿需要CLSID.
把你的DEBUG\*.tlh贴出来看看就是明白了.Top
7 楼nokialiu(一笑而过)回复于 2004-09-03 10:59:48 得分 0
idl中接口声明如下:
[
uuid(DDD90141-8FE4-11D5-BAA6-000476208700),
helpstring("CSTA1EventProvider Control"),
control
]
coclass CSTA1EventProvider {
[default] dispinterface _DESP;
[default, source] dispinterface _DESPEvents;
};
tlh中_DESP的定义是这样:
struct __declspec(uuid("e56666c4-4f59-11d5-9e0a-000102a3fe41"))
_DESP : IDispatch
{
//
// Property data
//
__declspec(property(get=GetCbPort,put=PutCbPort))
short CbPort;
__declspec(property(get=GetCbServerName,put=PutCbServerName))
_bstr_t CbServerName;
//
// Wrapper methods for error-handling
//
// Methods:
long Connect ( );
IServiceRequestPtr CreateServiceRequest ( );
IStringParameterPtr CreateStringParameter ( );
IIntParameterPtr CreateIntParameter ( );
IULongParameterPtr CreateULongParameter ( );
IByteParameterPtr CreateByteParameter ( );
IComposedParameterPtr CreateComposedParameter ( );
IListOfParametersPtr CreateParameterList ( );
HRESULT Disconnect ( );
long PostRequest (
struct IServiceRequest * pServiceRequest );
IServiceResponsePtr SendRequestAndWaitAnswer (
struct IServiceRequest * pServiceRequest );
IServiceResponsePtr CreateServiceResponse ( );
HRESULT PostResponse (
IDispatch * pServiceResponse,
long InvokeID );
HRESULT AboutBox ( );
// Properties:
short GetCbPort ( );
void PutCbPort ( short _val );
_bstr_t GetCbServerName ( );
void PutCbServerName ( _bstr_t _val );
};
SKYXIE的方法还是行不通啊。Top
8 楼wangweixing2000(星(inspiration(灵感)))回复于 2004-09-03 13:58:22 得分 0
nRet=pApp.CreateInstance(__uuidof(_DESP));
肯定是你的clsid给错了!hoho!Top




