一个DLL中有一个对话框窗口类为DLLDlg,是在DLL中加入一个对话框资源后通过CLASSWIZZARD生成的,功能是做个资源管理器样的窗口。
该对话框为了被调用显示,有成员函数:
int DLLDlg::RemoteFileMng(char *ip, UINT uiPort)
{
m_Ip = ip;
m_UiPort = uiPort;

DoModal();
return m_netFuncRet;
}为了避免“资源切换”的问题,做了一个导出类:
class AFX_EXT_CLASS UIShell : public CObject  
{
public:
int RemoteFileMng(char* ip,UINT uiPort);
UIShell();
virtual ~UIShell();};int UIShell::RemoteFileMng(char* ip,UINT uiPort)
{
DLLDlg dlg;
return dlg.RemoteFileMng(ip,uiPort);}DLL导出的函数为:
int RemoteFileMng(char* ip,UINT uiPort)
{
UIShell shell;
return shell.RemoteFileMng(ip,uiPort);
}
也就是通过一层导出类的封装,通过DLL导出函数RemoteFileMng就可以打开对话框。而对话框的初始化如BOOL DLLDlg::OnInitDialog() 
{
CDialog::OnInitDialog();


         
         SHFILEINFO sfi;
hImageList = (HIMAGELIST)SHGetFileInfo("", 
0,
&sfi, 
sizeof(SHFILEINFO), 
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
//m_ListLeft.SendMessage( LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);
//m_ListRight.SendMessage( LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);

pCImgList = new CImageList;
pCImgList = CImageList::FromHandle(hImageList);
m_ListLeft.SetImageList(pCImgList,LVSIL_SMALL);
         return TRUE;  // return TRUE unless you set the focus to a control
              // EXCEPTION: OCX Property Pages should return FALSE
}/**********************************************************/
代码如上,为什么对话框第1次被某界面程序打开能成功出现图标,而后再打开就不行了,一定要重新运行界面程序重新再次打开对话框才行。

解决方案 »

  1.   

    OnInitDialog() 里面的代码,应该跟刷新没关系吧。把这些代码剥离出来做了一个最简模型,问题依旧。
      

  2.   

    哎,不行你就把DLL改下,每次调用的时候传一个图片指针进去
      

  3.   

    这样试下
    m_ListLeft.DeleteAllItems ();
    ASSERT(pCImgList);
    m_ListLeft.SetImageList(pCImgList,LVSIL_SMALL);
      

  4.   

    现在我
    DLLDlg dlg;
    dlg.RemoteFileMng(ip,uiPort);
    return dlg.RemoteFileMng(ip,uiPort);
    在一个对话框对象生存周期内连续两次DoModal();第二次也是没有图标。
      

  5.   

    发现就算不写在DLL里面,也是一次成功问题更精简了
      

  6.   

    pCImgList = new CImageList;
    pCImgList.DeleteImageList(); 
      

  7.   

    详细流程:
    用VC6做一个MFC对话框EXE,其主对话框上只保留按钮BBB。
    给工程添加对话框资源,上面放一个LISTCTRL控件然后用CLASSWIZARD给对话框生成类DDD,给LISTCTRL控件帮定变量m_list。
    DDD类添加成员变量HIMAGELIST hImageList,在DDD的OnInitDialog里,用SHGetFileInfo给hImageList获取系统图标,然后给m_list加入图标。
    BBB按钮响应里,用DDD类生成对象ddd,dddDoModal。只有第1次DoModal才有图标,第2次以后都没有了,不知道为什么。
      

  8.   

    BOOL exeDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    m_list.InsertColumn(0,"Name",LVCFMT_LEFT,60);
    m_list.InsertColumn(1,"Size",0,60);
    m_list.InsertColumn(2,"Date",0,80);

    SHFILEINFO sfi;
    hImageList = (HIMAGELIST)SHGetFileInfo("", 
    0,
    &sfi, 
    sizeof(SHFILEINFO), 
    SHGFI_SYSICONINDEX | SHGFI_SMALLICON);


    m_list.SendMessage(LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hImageList);


    m_list.InsertItem(0,"hello",3);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }
      

  9.   

    "用SHGetFileInfo给hImageList获取系统图标,然后给m_list加入图标"主要看这成功不,试试直接加载一张图片看是不是每次都成功
      

  10.   

    按照某相同问题贴
    “终于明白了,原来 
    m_hImageList   =   (HIMAGELIST)SHGetFileInfo( "C:\\ ",0,&m_shFi,sizeof(m_shFi), 
    SHGFI_SYSICONINDEX|SHGFI_SMALLICON); 
    在一个进程里面不能调用多次,否则后面的调用会无效。 改进办法是:把dialog的成员变量m_hImageList变为静态变量,然后在进程开始的时候就调用一次就可以了,后面无论有多少个dialog的实例产生,都只使用静态变量m_hImageList的内容。”
    我也做成静态变量,却仍然解决不了。
      

  11.   

    现在模型已经是最简单的了:
    详细流程:
    用VC6做一个MFC对话框EXE,其主对话框上只保留按钮BBB。
    给工程添加对话框资源,上面放一个LISTCTRL控件然后用CLASSWIZARD给对话框生成类DDD,给LISTCTRL控件帮定变量m_list。
    DDD类添加成员变量HIMAGELIST hImageList,在DDD的OnInitDialog里,用SHGetFileInfo给hImageList获取系统图标,然后给m_list加入图标。
    BBB按钮响应里,用DDD类生成对象ddd,dddDoModal。只有第1次DoModal才有图标,第2次以后都没有了,不知道为什么。
    有没有给力直接的答案。
      

  12.   

    使用一个pCImgList,调用Attach(hImagelist)和Detach(),就解决了。
    问题解决了,不过有个新问题:
    我仍然使用的是hImagelist来给LISTCTRL设置图标,pCImgList的出现也只是在初试和结束对话框各调用了一次Attach(hImagelist)和Detach(),为什么第2次对话框就正常了?因为毕竟设置的是hImagelist而不是pCImgList啊?