如题, win32 sdk编译的EXE,载入delphi写的dll,dll创建子窗口,子窗口上的按钮,一点击,整个程序就卡死,但是在子窗口上怎么点都不会. 其他控件也试过,都一样,还没有执行事件代码,就卡死了. 

解决方案 »

  1.   

    我又试了下,我把CreateParented 换成 Create创建窗口,就没事了,为什么会这样呢.
      

  2.   

    不好意思各位,我弄错了,没有用CreateParented的时候,根本没有ChildWindow属性,使用SetWindowLong来设置style增加ChildWindow属性后,还是一样的情况,卡死.
      

  3.   

    function CC_Plugininit(CCVersion:PAnsiChar;CChWnd:HWND;hInst:Cardinal;var CplhWnd:HWND;var CplhIcon:HICON;shortname:PAnsiChar):UINT;stdcall;
    begin
      hWndMain := CChWnd;
      Form1 := TForm1.CreateParented(CChWnd);
      //Form1 := TForm1.Create(nil);
      CplhWnd := Form1.Handle;
      CplhIcon := LoadIcon(HInstance,'MYICON');
      lstrcpy(shortname,'我是Delphi');
      CC_InitFunction(hInst);
      CC_Addtolist('我是Delphi',RGB(255,0,0));
      Result := 1;
    end;
    这个函数被导出,提供给SDK编译的EXE调用.HWND CplhWnd = NULL;
    HICON CplhIcon = NULL;
    char szTabCaption[32] = {0};
    pPluginInfo.CC_Plugininit("2.6",hWndMain,hInst,CplhWnd,CplhIcon,szTabCaption);
    if (CplhWnd != NULL && IsWindow(CplhWnd))
    {
    pPluginInfo.hPluginWnd = CplhWnd;
    TCITEM tie;
    int nIcon = -1;
    if (CplhIcon != NULL)
    {
    nIcon = ImageList_AddIcon(hImageList,CplhIcon);
    }
    tie.mask = TCIF_TEXT|TCIF_IMAGE|TCIF_PARAM;
    tie.iImage = nIcon;
    tie.pszText = (LPSTR)szTabCaption;
    tie.lParam = nPos;
    TabCtrl_InsertItem(hWndTabCtrl,nPos,&tie);
    //SetWindowLong(CplhWnd,GWL_STYLE,WS_CHILDWINDOW|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN);
    SetParent(CplhWnd,hWndTabCtrl);
    RECT rc;
    GetClientRect(hWndTabCtrl,&rc);
    rc.right -= 4;
    rc.left  += 1;
    rc.top   += 22;
    rc.bottom -= 24;
    MoveWindow(CplhWnd,rc.left,rc.top,rc.right,rc.bottom,TRUE);
    //SetWindowPos(CplhWnd,HWND_TOP,rc.left,rc.top,0,0,SWP_NOSIZE);
    ShowWindow(CplhWnd,SW_SHOW);
    }这个是在EXE里LoadLibrary dll后,GetProcAddress得到函数地址,然后调用,在参数中返回DLL创建的窗口句柄,执行SetWindowLong设置窗口风格,然后使用SetParent设置窗口的父级. 问题出在delphi创建的这个窗口,如果风格设置为ws_childwindow就出现无法响应事件并且程序假死的问题,如果是ws_popup就不会,但是这样的风格不是我希望的.dll里窗口的属性是默认的.除了将BorderStyle设置为bsNone外没有修改其他的
      

  4.   

    createParented会依据传进来的参数,设置窗口类的wndParent。与childwindow不是一回事。
    childwindow类似button这种效果。
    不知道你要的是MDI效果还是ChildWindow的效果?
      

  5.   

    但是不管用CreateParented还是Create,只要设置成WS_ChildWindow的风格就出现这个问题.
      

  6.   

    try:在创建dll中的form时,去除WS_OVERLAPPEDWINDOW风格,同时设置WS_ChildWindow风格
      

  7.   

    我用spy++看了,是没有WS_OVERLAPPEDWINDOW风格的,如果加上这个风格,就会出现边框和标题栏.
      

  8.   

    DELPHI创建的子窗口上,鼠标移动,点击左右键都没问题,在按钮上单击双击右键都可以,就是一点左键就卡死.并没有映射任何的事件.
      

  9.   

    晕啊,我刚刚又试了一下,在子窗口上增加OnClick消息,在窗口上点击,事件的代码可以正常执行,没有什么问题.
      

  10.   

    试试将子窗口风格设置为ToolWindow