控件不行吧,控制台程序又没有窗口(没有控件的容器)。
改成com组件,用ATL的话还可以直接生成服务的exe。

解决方案 »

  1.   

    只能用ATL方式来写么?如果需要容器我可以用CreateWindowEx创建一个,这样难道不行?
      

  2.   

    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&brvbar;WS_VISIBLE&brvbar;WS_HSCROLL&brvbar;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);
      

  3.   

    我的代码是这样写的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。这是什么原因呢?
      

  4.   

    上面的代码写错了,更正一下。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。这是什么原因呢?
      

  5.   

    其实我已经用下面的代码创建了该控间,它的界面已经显示到了窗口上,但是我应该怎样才能访问到它?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对象,我试了很多方法都不行,我想知道如何能够正确的将它装换成我需要的接口?谢谢……