先写了一个idl,用midl编译后,
得到tlb,在vb中 建立active dll,引用tlb,创建了一个类实现这个接口
(因为主要是界面操作,所以选用vb)然后编译成dll用另一个vb程序测试,工作良好用vc做了一个类包装这个com,运行是,跟踪调试,发现
创建对象成功.调用和界面无关的函数成功,
与界面有关的如显示窗体的函数,一律返回 0x800a0196 错误
查一下错误信息,没查到我注销了这个dll,让vb***解释***运行这个com,
启动vc做的测试程序,显示窗体成功,一切正常.一句话,就是vb解释运行的时候,vc可以调用成功,vb编译成dll后,vb测试程序仍可以调用成功,但是vc测试程序不能显示窗体,返回0x800a0196 ,调用与窗体无关的函数,S_OK.注:
vc测试程序中.
::CoInitialize(NULL);
::OleInitialize(NULL);
已经调用了,com和ole都初始化了.请各位大侠指教.
得到tlb,在vb中 建立active dll,引用tlb,创建了一个类实现这个接口
(因为主要是界面操作,所以选用vb)然后编译成dll用另一个vb程序测试,工作良好用vc做了一个类包装这个com,运行是,跟踪调试,发现
创建对象成功.调用和界面无关的函数成功,
与界面有关的如显示窗体的函数,一律返回 0x800a0196 错误
查一下错误信息,没查到我注销了这个dll,让vb***解释***运行这个com,
启动vc做的测试程序,显示窗体成功,一切正常.一句话,就是vb解释运行的时候,vc可以调用成功,vb编译成dll后,vb测试程序仍可以调用成功,但是vc测试程序不能显示窗体,返回0x800a0196 ,调用与窗体无关的函数,S_OK.注:
vc测试程序中.
::CoInitialize(NULL);
::OleInitialize(NULL);
已经调用了,com和ole都初始化了.请各位大侠指教.
uuid(19851206-D354-2005-AF10-7854687512AA),
version(1.0)
]
library OceanMediaLibLib
{
importlib("stdole2.tlb"); // Forward declare all types defined in this typelib
interface IMediaLib;
[
odl,
uuid(19851206-CDFA-4311-B398-5662D77BB322),
version(1.0),
dual,
nonextensible,
oleautomation
]
interface IMediaLib: IDispatch {
[id(0x60030001)]
HRESULT GetNextOne([out,retval]BSTR* filename);
[id(0x60030002)]
HRESULT GetLoopNextOne([out,retval]BSTR* filename);
[id(0x60030003)]
HRESULT GetRndNextOne([out,retval]BSTR* filename);
[id(0x60030004)]
HRESULT GetPrevOne([out,retval]BSTR* filename);
[id(0x60030005)]
HRESULT Init([in]long mainHwnd,[out,retval]long* mlHwnd); [id(0x60030006)]
HRESULT Show();
[id(0x60030007)]
HRESULT Hide(); [id(0x60030008)]
HRESULT UserOpened([in]BSTR* filename);
[id(0x60030009)]
HRESULT UserAppend([in]BSTR* filename); [id(0x6003000A)]
HRESULT SetFilter([in]BSTR* filter); };
};这个idl只是声明接口,没有实现.
我想,问题可能是因为你没有注册interface或type library造成的。
你试试看把非模式对话框改成模式的(vbModal),看看是不是可以用。可以参考一下这篇文章。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;171978PS. tlb注册还和marshal有关,如果你用系统提供的proxy/stub功能的话。
http://support.microsoft.com/default.aspx?scid=kb;en-us;247791
但是模式的不符合要求,达不到设计的效果.com中不能用非模式对话框马?
如何让主程序支持非模式对话框呢?
看了那两篇文章我明白了.要能显示非模式的对话框,就必须让他参与消息循环.如果是模式的花,就不用了.在调用domodel的时候
讲消息循环的控制权交给了对话框的消息循环.这样非模式的就可以用了,
我那个问题,昨天解决了,我把它做成active exe就行了.我当时不知道为什么,现在明白了.谢谢