问个关于WTL的问题!有熟悉的高手请帮忙!

guti_milan 2007-12-15 10:12:43
首先说一下环境
OS:winXP SP2
IDE:VC++2005 SP1
WTL8.0
dialog程序 里面加了三个 用MFC写的ActiveX控件(已经注册),然后 import路径 定义接口变量...
代码:
以一个控件为例
CAxWindow m_wndVocx;
CComPtr<_DVocx> m_vocx;
.....
m_wndAocx = GetDlgItem(IDC_AOCXCTRL);//绑定ID
//下面是得到_DVocx接口
HRESULT hr = m_wndVocx.QueryControl(&m_vocx);
ATLASSERT(hr == S_OK);
//m_vocx得到了值
但是发现 编译后的 vocx.tlh文件中
一个方法也没有

struct __declspec(uuid("9a6104af-0e26-4a90-961f-3c6d2fb3a569"))
_DVocx : IDispatch
{//空的};

为什么会这样 不解中!!!!
请高手指点 是要自己添加吗?不应该啊
我插入一个flash控件的时候 他的tlh文件里面的方法都有啊
郁闷中。。。。。。
...全文
129 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
guti_milan 2007-12-18
  • 打赏
  • 举报
回复
看来只能这样了 结帖!
jameshooo 2007-12-17
  • 打赏
  • 举报
回复
看出问题了,人家_DAocx接口是隐藏的(看看属性里面的hidden),import时不会生成属性和接口。

你可以建一个一样的接口,然后仿照import后生成的文件手工做一个文件,把名字改成_DAocx即可。隐藏属性仅仅无法看到内容,但是内容都是可以用的
guti_milan 2007-12-17
  • 打赏
  • 举报
回复
顶一下 回去了
guti_milan 2007-12-17
  • 打赏
  • 举报
回复
其中一个控件 有问题吗
guti_milan 2007-12-17
  • 打赏
  • 举报
回复
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: aocx.ocx

[
uuid(AD5FE9A2-4D42-4DBB-A9EA-4D7AAFA112BD),
version(1.0),
helpstring("aocx ActiveX Control module"),
helpfile("aocx.hlp"),
helpcontext(00000000),
custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 83951780),
custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1197075952)

]
library AOCXLib
{
// TLib : // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");

// Forward declare all types defined in this typelib
dispinterface _DAocx;
dispinterface _DAocxEvents;

[
uuid(94561183-AD27-4373-BC0B-2177A89D7955),
helpstring("Dispatch interface for Aocx Control"),
hidden
]
dispinterface _DAocx {
properties:
[id(0x00000001)
]
VARIANT_BOOL IsOpen;
[id(0x00000002)
]
long nMyPort;
[id(0x00000003)
]
long nGroupID;
[id(0x00000004)
]
long nMyUIN;
methods:
[id(0x00000005)]
long initialize();
[id(0x00000006)]
long SetRCode(
long ComType,
long MPackSize,
long EchoVal,
long G723);
[id(0x00000007)]
long SetTCode(
long ComType,
long MPackSize,
long PreVal,
long SilenSup,
long MaxFrames,
long G723);
[id(0x00000008)]
long SetDest(
BSTR sDestIP,
long nPort);
[id(0x00000009)]
long SetRPort(long nPort);
[id(0x0000000a)]
long SetLoginNATSvr2(
long myUIN,
long DestUIN,
long myPort,
long DestPort,
BSTR sServerIP,
long nSrvPort);
[id(0x0000000b)]
long SetMVolume(
long dID,
long vol);
[id(0x0000000c)]
long SetNetwork(
BSTR sIP,
long nPort,
BSTR sProxyIP,
long nProxyPort,
BSTR sUserName,
BSTR sPass);
[id(0x0000000d)]
long SetSVol(
long dID,
long vol);
[id(0x0000000e)]
long StartRecv(long waveoutDID);
[id(0x0000000f)]
long StartTran(long waveinID);
[id(0x00000010)]
long StopRran();
[id(0x00000011)]
long StopRecv();
[id(0x00000012)]
long Destroy();
[id(0x00000013)]
long GetErrorCode(long val);
[id(0x00000014)]
long MCURegPort(long nPort);
[id(0x00000015)]
long MCUSendAudio();
[id(0x00000016)]
long MCUSetNetwork(
BSTR sSvrIP,
long nPort);
[id(0x00000017)]
VARIANT_BOOL MicrophoneAvailable();
[id(0x00000018)]
VARIANT_BOOL SpeakerAvailable();
[id(0x00000019)]
long MCUPause(VARIANT_BOOL bStop);
[id(0x0000001a)]
long PCMDataDestination(
BSTR sIP,
long nPort);
[id(0xfffffdd8)]
void AboutBox();
};

[
uuid(DF6D9735-7F9C-4FFE-AB7E-DD57B2CAA841),
helpstring("Event interface for Aocx Control")
]
dispinterface _DAocxEvents {
properties:
methods:
[id(0x00000001)]
void OnErrCode(
long nCode,
BSTR sMsg);
[id(0x00000002)]
void OnConnect(VARIANT_BOOL bConn);
};

[
uuid(EC7B8046-67CD-4B5B-B56E-2BF6BF56D215),
helpstring("Aocx Control"),
control
]
coclass Aocx {
[default] dispinterface _DAocx;
[default, source] dispinterface _DAocxEvents;
};
};
firmbird 2007-12-17
  • 打赏
  • 举报
回复
直接用OleView导出IDL文件吧
jameshooo 2007-12-17
  • 打赏
  • 举报
回复
用OleView来检查一下这个控件,看看接口方法是否齐全。如果有问题,重新注册一次控件试试。
guti_milan 2007-12-17
  • 打赏
  • 举报
回复
这个控件是人家给的 不是我自己写的!所以没有IDL文件。。。
jameshooo 2007-12-17
  • 打赏
  • 举报
回复
把IDL文件贴上来看看
guti_milan 2007-12-17
  • 打赏
  • 举报
回复
按照 楼上的说法 用 ActiveX控件测试容器 测试了 方法都有啊
这个又是怎么回事呢?
jameshooo 2007-12-15
  • 打赏
  • 举报
回复
ActiveX控件没做好
forwtl 2007-12-15
  • 打赏
  • 举报
回复
哈哈,我也说到过类似的。

以前的一个工程 import 无问题,到vs2005,就不行了。

最后 CoCreateInstance 搞定的,你参考一下,不一定能解决你的问题。
eduyu 2007-12-15
  • 打赏
  • 举报
回复
正常情况下,每个activeX工程会有个纯文本的odl文件,vc会帮你把该odl文件编译成.tlb文件,一般.tlb文件会被编译进exe文件的资源内,当然也可以单独成文件。关键是tlb文件也要被注册,这样系统才能找到activeX对应的typelib。别人在用你的activeX的时候需要根据tlb来生成c++语言可用的头文件,也就是tlh文件。
guti_milan 2007-12-15
  • 打赏
  • 举报
回复
如果没有 lib 怎么生成lib?
eduyu 2007-12-15
  • 打赏
  • 举报
回复
你的activeX的控件的type lib到底在不在呢?vc找到了才能产生tlh。另:这个和WTL好像没什么关系。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧