extern "C"__declspec (dllexport) long OpenOnePort_Socket(CWnd* pParentWnd,unsigned char bPortType, int localPort,int serverPort,CString serverIP)
{
if((bPortType == PT_TCPCLIENT) || (bPortType == PT_TCPSERVER))
{
PMySocketTcp = new CMySocketTCP; //class CMySocketTCP : public CWnd   PMySocketTcp->Create(_T("STATIC"), "", WS_CHILD,
   CRect(0, 0, 2, 2), pParentWnd, 1234);//到这句出错

          }
}
我用上述方法不用动态链接库时可以创建PMySocketTcp对象,可是用动态链接库后传进来的pParentWnd就没有句柄了,到Create那行代码就出错,请教怎么在动态链接库中创建控件?因为我要用到窗口的消息传输(WSAAsyncSelect(m_Listen,m_hWnd,WM_SOCKET,FD_ACCEPT);)

解决方案 »

  1.   

    创建一个child类型的对话框,直接指定下对话框的父窗口也行
      

  2.   

    可以说的具体点吗?
    我用下边语句也不行
    PMySocketTcp = new CMySocketTCP;
    PMySocketTcp->Create((UINT)3333,pParentWnd);//class CMySocketTCP : public CDialog
      

  3.   

    你这个情况,还不如DLL中给你的窗口发送消息,DLL只进行逻辑相关的处理
      

  4.   

    因为我要在DLL中用到WSAAsyncSelect()函数,比如有socket连接到达时进入相应的消息响应函数,而消息传递必须要用到窗口的概念,所以才得在DLL中建控件,为的是去掉控件的句柄,以便使用WSAAsyncSelect()函数。
      

  5.   

    那你就不传指针,直接传句柄,再在里面用CWnd::FromHandle(hwnd)来得到指针
      

  6.   

    你怎么判断这个指针没有句柄了?
    你应该单独调试看看,确认有没有句柄,然后在结合WSAAsyncSelect。
    以下是别人在dll中创建对话框窗口:你可先试试
    dll中创建无模式窗口的过程如下: CMsgDlg*   dlg=new   CMsgDlg; 
    dlg-> Create(IDD_DIALOG1); 
    dlg-> ShowWindow(SW_SHOW); 其中IDD_DIALOG1是你在dll工程的添加的对话框资源。 
      

  7.   


    用动态链接库后传进来的pParentWnd就没有句柄
    什么叫没有句柄,难道是NULL?
      

  8.   

    我按你说的方法实验了,还是不行,我在dll中加了一个对话框资源(对应CMsgDlg),可是只要执行dlg-> Create(IDD_DIALOG1);就死了,报错说Debug Assertion Failed!
    Program:....
    File:afxwin1.inl
    Line:22
    ..............

    哪位有在DLL中创建对话框或控件的例子能不能发个?感激涕零!!!