如下代码
HXCreateInstance(IUNknown** ppExFileFormatObj)
{
**ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();什么意思
(IUnknown*)(IHXPlugin*)什么含义呢小弟对指针实在不熟,看着就晕
HXCreateInstance(IUNknown** ppExFileFormatObj)
{
**ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();什么意思
(IUnknown*)(IHXPlugin*)什么含义呢小弟对指针实在不熟,看着就晕
解决方案 »
- wm_command怎么会响应edit啊
- API可以挂起/恢复线程。可以这样操作进程么?
- 当把treectrl的某个节点用TVIS_BOLD变成高亮后,以后如何判断某个节点是否处于加粗状态?
- 如何监控另外一个用户的rdp连接?
- DirectShow和钩子问题
- 如果我有一个对话框,上面有一些控件,我重载什么函数可以使得任何对话框中的界面操作,都进入这个函数处理?谢谢!
- 请教一个关于对话框创建时的问题
- 怎样实现内存文件?——MFC的cmemfile是如何实现的?
- 求助:从VB.net向VC使用Named Pipe传送数据不正确
- VC的编译优化,真是见鬼了……
- 一个很奇怪的问题,TCP连接,服务器给客户端发了一个数据,可是客户却收不到?什么情况会造成这些?
- 如何准确得到网页中特定内容和与之对应的数据!
IUNknown* p=NULL;
HXCreateInstance(&p);
这样的话p就被构造了一个CMyExampleFileFormat类型的对象的指针,用完之后,记得释放,就好了
delete p;
p=NULL;
因为这涉及对象的内存布局。你的对象是多重继承,其布局类似如下:
IUnknown的部分
IHXPlugin的部分
你的非静态成员变量
你的类的vptr因为IUnknown和IHXPlugin都没有成员变量,因此只有一个data member,虚函数表指针(vptr)。(有些编译器可能不止会再多一个字节,详情请参考对象模型的资料)
而new 返回的指针指向第一个位置,即IUnknown的部分,因此在这可以直接取得。但当你的对象实现了多个接口,如IA和IB(IA和IB都从IUnknown派生),则布局如下:
IUnknown的部分
IA的部分
IUnknown的部分
IB的部分
你的非静态成员变量
你的类的vptr因此又可以说可以直接取得IUnknown*,但有些编译器可能将你的“你的类的vptr”放在前面,这样如果直接取将会得到指向你的类的vptr的指针,当调用时将会出现错误(如调用IUnknown::AddRef,其取得的函数地址已不再是IUnknown::AddRef,错误)。之所以要先(IHXPlugin*)就是要先使其指向正确的地方,对于上例,(IB*)后指针已指向第二个“IUnknown的部分”(因为IB其实包含第二个“IUnknown的部分”和“IB的部分”)。此时也必须调用(IUnknown*),它有可能将IB的vptr放在第二个“IUnknown的部分”之前,如果直接取就又错误了
应该是
*ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();
吧
*ppExFileFormatObj=(IUnknown*)(IHXPlugin*)new CMyExampleFileFormat();
不说还没看出来:(
使用(IUnknown*)(IHXPlugin*)的原因是,new CMyExampleFileFormat()返回的指针不能直接强制转换成IUnknown*,因此需要一个中间指针类型转换,这就是IHXPlugin*。这是CPP强类型的特点,如果在C中(事实C中根本就没有类,但有类似的情况),不要强制类型转换也能通过。类似的例子:CString转换成LPTSTR是失败的:
LPTSTR lptstr;
CString str;
lptstr=(LPTSTR)str;//将报告错误但使用中间类型后就OK了:
lptstr=(LPTSTR)(LPCTSTR)str;//本语句OK