关于控制台程序创建ActiveX控件的难题…… 控件不行吧,控制台程序又没有窗口(没有控件的容器)。改成com组件,用ATL的话还可以直接生成服务的exe。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 只能用ATL方式来写么?如果需要容器我可以用CreateWindowEx创建一个,这样难道不行? why not use ATL? it is very easy to do so in ATL. CComQIPtr<IWebBrowser2> m_spBrowser;CAxWindow content_wnd;......if( _tcslen(m_tcHtmlFileName) > 0 ){RECT rc;GetClientRect( &rc );if(m_spBrowser==NULL){LPOLESTR pstrbrowserid;StringFromCLSID(IID_IWebBrowser2,&pstrbrowserid);_bstr_t bstrbrowser(pstrbrowserid);CoTaskMemFree(pstrbrowserid);if(content_wnd.IsWindow())content_wnd.DestroyWindow();content_wnd.Create( m_hWnd, rc, LPCTSTR(bstrbrowser), WS_CHILD¦WS_VISIBLE¦WS_HSCROLL¦WS_VSCROLL );//create a browser controlHRESULT hrbrowser;hrbrowser = content_wnd.QueryControl( IID_IWebBrowser2, reinterpret_cast<void**>(&m_spBrowser) );}#import "c:\winnt\system32\mswinsck.ocx" no_namespace...IMSWinsockControlPtr pWinsock;_bstr_t pstr("mswinsock.winsock");CLSID clsidwinsock;CLSIDFromProgID(pstr,&clsidwinsock);pWinsock.CreateInstance(clsidwinsock);if(pWinsock){pWinsock->RemotePort=13;pWinsock->RemoteHost=_bstr_t("time-a.nist.gov");_variant_t varoptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);HRESULT hr= pWinsock->Connect();if(FAILED(hr))MessageBox(NULL,"failed","failed",MB_OK);......pWinsock->Close();}elseMessageBox(NULL,"can not create winsock","error",MB_OK); 我的代码是这样写的CWindowImpl<CSnatchData>::Create(hParentWnd, rc, _T("Hello"), WS_CHILD | WS_VISIBLE);m_poTMCtrl = new CAxWindow(hWnd);HWND hWnd = m_poTMCtrl.Create(m_hWnd, rc, LPCTSTR("XCOMM.XCommCtrl.1"), WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL);HRESULT hr = wnd.QueryControl(GetTMDXCommIID(), reinterpret_cast<void**>(&m_poTMInst));第一句执行后是成功的会产生新的m_hWnd,但是当m_poTMCtrl创建时则失败了hWnd为0x00000000,当执行QueryControl后hr的值将会是0x80004005。这是什么原因呢? 上面的代码写错了,更正一下。CWindowImpl<CSnatchData>::Create(hParentWnd, rc, _T("Hello"), WS_CHILD | WS_VISIBLE);m_poTMCtrl = new CAxWindow(hWnd);HWND hWnd = m_poTMCtrl->Create(m_hWnd, rc, LPCTSTR("XCOMM.XCommCtrl.1"), WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL);HRESULT hr = m_poTMCtrl->QueryControl(GetTMDXCommIID(), reinterpret_cast<void**>(&m_poTMInst));第一句执行后是成功的会产生新的m_hWnd,但是当m_poTMCtrl创建时则失败了hWnd为0x00000000,当执行QueryControl后hr的值将会是0x80004005。这是什么原因呢? 其实我已经用下面的代码创建了该控间,它的界面已经显示到了窗口上,但是我应该怎样才能访问到它?CComPtr<IUnknown> oUnk;RECT rc = {0, 0, 32, 32};CWindowImpl<CSnatchData>::Create(hParentWnd, rc, _T("Hello"), WS_CHILD | WS_VISIBLE);AtlAxCreateControl(_bstr_t("XCOMM.XCommCtrl.1"), hWnd, NULL, reinterpret_cast<IUnknown**>(&oUnk));我现在能够得到IUnknown对象,我试了很多方法都不行,我想知道如何能够正确的将它装换成我需要的接口?谢谢…… 如果在WIN7的credential provider中修改当前要登录的用户的注册表键值? 求救:如果制作反方向的进度条(进度条开始从右向左或者从上向下走) 又是installshield的问题!! 打印预览按键不更新问题 请问如何注册OCX控件,注册后如何在程序中使用? 如果在对话框应用程序中设置字体及颜色? 一个简单的问题,怎样设置工具条中的控件不可用? 加密高手请进 【堆内存相关】关于进程销毁时堆内存的释放 如何做一个风格按钮控件(ocx),在PB中调用??????????????? 如何判断文本文件 .txt的结束标志? windows程序设计代码那有载,
CComQIPtr<IWebBrowser2> m_spBrowser;
CAxWindow content_wnd;
......
if( _tcslen(m_tcHtmlFileName) > 0 )
{
RECT rc;
GetClientRect( &rc );
if(m_spBrowser==NULL)
{
LPOLESTR pstrbrowserid;
StringFromCLSID(IID_IWebBrowser2,&pstrbrowserid);
_bstr_t bstrbrowser(pstrbrowserid);
CoTaskMemFree(pstrbrowserid);
if(content_wnd.IsWindow())
content_wnd.DestroyWindow();
content_wnd.Create( m_hWnd, rc, LPCTSTR(bstrbrowser), WS_CHILD¦WS_VISIBLE¦WS_HSCROLL¦WS_VSCROLL );//create a browser control
HRESULT hrbrowser;
hrbrowser = content_wnd.QueryControl( IID_IWebBrowser2, reinterpret_cast<void**>(&m_spBrowser) );
}#import "c:\winnt\system32\mswinsck.ocx" no_namespace
...
IMSWinsockControlPtr pWinsock;
_bstr_t pstr("mswinsock.winsock");
CLSID clsidwinsock;
CLSIDFromProgID(pstr,&clsidwinsock);
pWinsock.CreateInstance(clsidwinsock);
if(pWinsock)
{
pWinsock->RemotePort=13;
pWinsock->RemoteHost=_bstr_t("time-a.nist.gov");
_variant_t varoptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
HRESULT hr= pWinsock->Connect();
if(FAILED(hr))
MessageBox(NULL,"failed","failed",MB_OK);
......pWinsock->Close();
}
else
MessageBox(NULL,"can not create winsock","error",MB_OK);
m_poTMCtrl = new CAxWindow(hWnd);
HWND hWnd = m_poTMCtrl.Create(m_hWnd, rc, LPCTSTR("XCOMM.XCommCtrl.1"), WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL);
HRESULT hr = wnd.QueryControl(GetTMDXCommIID(), reinterpret_cast<void**>(&m_poTMInst));第一句执行后是成功的会产生新的m_hWnd,但是当m_poTMCtrl创建时则失败了hWnd为0x00000000,当执行QueryControl后hr的值将会是0x80004005。这是什么原因呢?
m_poTMCtrl = new CAxWindow(hWnd);
HWND hWnd = m_poTMCtrl->Create(m_hWnd, rc, LPCTSTR("XCOMM.XCommCtrl.1"), WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL);
HRESULT hr = m_poTMCtrl->QueryControl(GetTMDXCommIID(), reinterpret_cast<void**>(&m_poTMInst));第一句执行后是成功的会产生新的m_hWnd,但是当m_poTMCtrl创建时则失败了hWnd为0x00000000,当执行QueryControl后hr的值将会是0x80004005。这是什么原因呢?
RECT rc = {0, 0, 32, 32};
CWindowImpl<CSnatchData>::Create(hParentWnd, rc, _T("Hello"), WS_CHILD | WS_VISIBLE);
AtlAxCreateControl(_bstr_t("XCOMM.XCommCtrl.1"), hWnd, NULL, reinterpret_cast<IUnknown**>(&oUnk));我现在能够得到IUnknown对象,我试了很多方法都不行,我想知道如何能够正确的将它装换成我需要的接口?谢谢……