代码很简单如下:
BOOL CExtFuncs::_SetGroupCustomProp(LPCTSTR sGrpName, LPCTSTR sPropName)
{
HWND hwnd = AfxGetMainWnd()->GetSafeHwnd();//此处返回空
CWinApp* pApp = AfxGetApp();//此处返回空
CFrameWnd* pMain = (CFrameWnd*)AfxGetApp()->m_pMainWnd;//此处异常了
ASSERT(pMain);
::SendMessage(pMain->GetSafeHwnd(), WM_BASIC_GRP_PROP, (WPARAM)sGrpName, (LPARAM)sPropName);
return TRUE;
}
这是一个DLL中的函数在多文档中响应后调用,在Debug下一切正常,但是到了Release下居然出错了,调试发现居然是AfxGetApp返回值为空,这是为什么?编译器是VS2008。

解决方案 »

  1.   

    添加一个参数HWND直接传递窗口句柄行不
      

  2.   

    CWinApp * pApp=AfxGetApp();  这样取不到,直接调theApp试试看。
      

  3.   

    http://blog.163.com/xiang_163_ok/blog/static/6171684520082981548598/
      

  4.   

    这个函数是一个COM的自动化函数,没办法传递HWND。
      

  5.   

    用void *类型的指针把HWND传进去,再强制转换
      

  6.   

    这个函数是一个VB的自定义脚本函数,不知道如何传一个HWND进去。我不明白的是为什么Debug可以但是Release却不行?
      

  7.   

    BOOL CExtFuncs::_SetGroupCustomProp(void *pParam,LPCTSTR sGrpName, LPCTSTR sPropName)
    {
    HWND *phwnd = (HWND *)pParam;
    return TRUE;
    }
    类似这样行不
      

  8.   

    似乎没办法这样做,比如应该这样调用SetGroupCustomProp("Group1","Prop1"),函数名和脚本是用户自己手动写的,然后程序调用,总不能让用户自己获得HWND然后作为参数传进来吧!
      

  9.   

    http://www.cppblog.com/maosher/archive/2010/08/26/124783.html
      

  10.   

    AfxGetMainWnd()的使用依赖于线程
    具体参加源代码 1_AFXWIN_INLINE CWnd* AFXAPI AfxGetMainWnd()
     2{ CWinThread* pThread = AfxGetThread();
     3   return pThread != NULL ? pThread->GetMainWnd() : NULL; }
     4
     5//而AfxGetThread获取的是当前线程,而不是主线程!
     6CWinThread* AFXAPI AfxGetThread()
     7{
     8// check for current thread in module thread state
     9AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
    10CWinThread* pThread = pState->m_pCurrentWinThread;
    11return pThread;
    12}
    13
    所以在非主线程里使用可能会有问题,解决方法,在新创建的线程里使用AfxGetApp()->m_pMainWnd;
      

  11.   

    问题已经解决了,其实是Unicode问题引起的,但并不理解为什么,还希望高人能够指点一二啊!