读书人

COM中关于返回值为HMODULE 的奇怪有关

发布时间: 2013-09-05 16:02:07 作者: rapoo

COM中关于返回值为HMODULE 的奇怪问题
本帖最后由 725137 于 2013-08-09 06:36:00 编辑 我在一个COM对象中定义了一个变量两个普通方法,打算用这个com对象来进行线程之间的参数传递。


class ATL_NO_VTABLE CDataObj :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDataObj, &CLSID_DataObj>,
public IDispatchImpl<IDataObj, &IID_IDataObj, &LIBID_NEWHELLO5Lib>
{
public:
CDataObj()
{
}

DECLARE_REGISTRY_RESOURCEID(IDR_DATAOBJ)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CDataObj)
COM_INTERFACE_ENTRY(IDataObj)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// IDataObj
public:
HMODULE GetHis();
void SetHis(HMODULE value);


private:
HMODULE his;
int requestId;
BSTR parameters;
BSTR methodName;
};





void CDataObj::SetHis(HMODULE value)
{
his = value;
//以下代码可以正常执行
typedef int (*getPosFun)();
getPosFun getPos = (getPosFun)GetProcAddress(his,"getPos");
getPos();
}

HMODULE CDataObj::GetHis() //返回指针的话改成HMODULE * CDataObj::GetHis()
{

typedef int (*getPosFun)();
getPosFun getPos = (getPosFun)GetProcAddress(his,"getPos");
getPos();
//以上代码也可以正常执行,如果这里返回一个指针 return &(this->his)也是不行的.
//外面也拿不到

return this->his;
}


现在的问题是如果我在外面调用

//以下代码就不能正常执行了,返回得到的HMODULE变得不正确了,为何????HMODULE要怎么样返回?
HMODULE h = obj->GetHis();
typedef int (*getPosFun)();
getPosFun getPos = (getPosFun)GetProcAddress(his,"getPos");
getPos();


如果我采用标准接口的方法,定义pug和get方法的话,在外面用指针的方法得到值。返回的始值是值对象。
比如我定义成一个long*变量,然后传入long*指针,[out,retval]得到的最终值变成了long.而传入的那个指针还是原来的值。
[解决办法]
COM接口返回值不都应该是HRESULT吗?



你要返回HMODULE,可以放到一个参数,OUT参数。
[解决办法]

引用:
Quote: 引用:

COM接口返回值不都应该是HRESULT吗?

你要返回HMODULE,可以放到一个参数,OUT参数。

我那又不是com接口啊。我是一个普通的方法而以。上面说了,用接口的方式,接口方法不能写HMODULE的。我定义成long*后。返回也不正常。


嗯,搞定就好了。


COM方法,如果返回这些值,就用LONG类型就OK了。

读书人网 >VC/MFC

热点推荐