VS中解决LIBCMTD.lib和uafxcwd.lib冲突(uafxcw.lib LIBCMT.lib冲突)

如果在编译MFC程序的时候出现下列及类似的错误:

1>uafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new.obj) 中定义
1>uafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(dbgdel.obj) 中定义
1>uafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new[](unsigned int)” (??_U@YAPAXI@Z) 已经在 libcpmtd.lib(newaop.obj) 中定义
1>uafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete[](void *)” (??_V@YAXPAX@Z) 已经在 LIBCMTD.lib(delete2.obj) 中定义

解决方法如下:

项目属性页-》链接器-》输入

做如下改动,注意顺序

debug版本

附加依赖库:uafxcwd.lib;LIBCMTD.lib;
忽略特定默认库:LIBCMTD.lib;uafxcwd.lib

release版本

附加依赖库:uafxcw.lib;LIBCMT.lib;

忽略特定默认库:LIBCMT.lib;uafxcw.lib

错误原因是由于这二个库有各自的new和delete,这是冲突的,需要指定顺序。正确加载库的顺序是uafxcw.lib Libcmtd.lib,而默认的是Libcmtd.lib uafxcw.lib。

转自:https://blog.csdn.net/whatday/article/details/53188029

AfxGetApp()->m_pMainWnd和AfxGetMainWnd()

今天在解决一个bug时关注到了这两个看上去貌似一样的东西:AfxGetApp()->m_pMainWnd和AfxGetMainWnd()。平时不用多线程时,都是随便用,用法上也没什么区别,也没去专门的研究。当有BUG存在时,才意识到。

由于我是在多线程中使用,每次用AfxGetMainWnd来sendmessage时,都会崩溃,将AfxGetMainWnd提取出来设给一个pWnd时,调试显示的是为空。然后我换成AfxGetApp()->m_pMainWnd后,调试却显示有值!

因此这两个东西的用法还是有不一样的:

1、AfxGetApp()->m_pMainWnd在多线程中,获得的是应用程序主线程的句柄。在这个应用程序中是唯一的。

2、AfxGetMainWnd()获得的是当前线程的句柄。,在多线程的应用程序中也是不唯一的。

cef调用主窗口应该使用AfxGetApp()->m_pMainWnd

MFC设置壁纸

// 设置强制
// 使用前必须初始化COM组件
static BOOL SetWallpaper(LPCTSTR lpszWallPaper, DWORD dwStyle = WPSTYLE_STRETCH)
{
    HRESULT hr;
    IActiveDesktop* pIAD;
    //创建接口的实例
    hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
        IID_IActiveDesktop, (void**)&pIAD);
    if (!SUCCEEDED(hr)) {
        return FALSE;
    }

    //COMPONENTSOPT co = {0};
    //co.dwSize = sizeof(COMPONENTSOPT);
    //co.fEnableComponents = TRUE;
    //co.fActiveDesktop = TRUE;
    //hr = pIAD->SetDesktopItemOptions(&co, 0);
    //if ( !SUCCEEDED(hr) ) 
    //    goto exit;
    ////将文件名改为宽字符串,这是IActiveDesktop::SetWallpaper的要求
    //WCHAR   wszWallpaper [MAX_PATH];
    //LPTSTR lpStr = strPicFile.GetBuffer(strPicFile.GetLength() );
    //MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wszWallpaper, MAX_PATH);
    //strPicFile.ReleaseBuffer();
    //设置墙纸
    hr = pIAD->SetWallpaper(lpszWallPaper, 0);
    if (!SUCCEEDED(hr)) {
        goto exit;
    }
        
    //设置墙纸的样式
    //WALLPAPEROPT wpo;
    //wpo.dwSize = sizeof(wpo);
    //wpo.dwStyle = dwStyle;
    //hr = pIAD->SetWallpaperOptions(&wpo, 0);
    //if(!SUCCEEDED(hr)) goto exit;
    //应用墙纸的设置
    hr = pIAD->ApplyChanges(AD_APPLY_ALL);
    if (!SUCCEEDED(hr)) {
        goto exit;
    }
    //读取墙纸的文件名并打印在debug窗口内
    //TCHAR szWallPaper[MAX_PATH];
    //hr = pIAD->GetWallpaper(szWallPaper, MAX_PATH, 0);
    //MessageBox(0,szWallPaper, 0, 0);
    //CString strFile = lpszWallPaper;
    //TRACE(strFile); //如果不用位图的话,这里有你意想不到的发现
    //释放接口的实例

exit:
    pIAD->Release();
    return SUCCEEDED(hr);
}

计算运行时长

// 设置计时
clock_t start, finish;
double totaltime;
start = clock();
finish = clock();
// 数据操作

// 判定执行时间
totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
CString strOutInfo;
strOutInfo.Format(_T("耗时%0.2f秒\n"), totaltime);
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), strOutInfo, wcslen(strOutInfo), NULL, NULL);

unicode与ascii字符转换

多字节转宽字节

// 使用完成后, 需要手动调用free函数释放内存
wchar_t* MToW(char* pstr, UINT nCodePage=CP_ACP)
{
    // 获取转换后所需要的内存大小
    int nstrLen = MultiByteToWideChar(nCodePage, 0, pstr, strlen(pstr), NULL, 0);
    // 申请内存
    wchar_t* pwszstr = (wchar_t*)malloc(sizeof(wchar_t)*(nstrLen + 1));
    // 清空内存
    ZeroMemory(pwszstr, sizeof(wchar_t)*(nstrLen + 1));
    // 进行转换
    nstrLen = MultiByteToWideChar(nCodePage, 0, pstr, strlen(pstr), pwszstr, nstrLen);
    // 字符串结尾
    pwszstr[nstrLen] = 0;
    return pwszstr;

}

USES_CONVERSION;/A2W
CA2W

宽字节转多字节

// 使用完成后, 需要手动调用free函数释放内存
char* WToM(const CString& str,UINT nCodePage=CP_ACP)
{
    // 转换后所需要的内存大小
    int nstrLen = WideCharToMultiByte(nCodePage, 0, str, wcslen(str), NULL, 0, NULL, NULL);
    // 申请内存空间
    char* pmstr = (char*)malloc(sizeof(char)*(nstrLen + 1));
    // 清空内存
    ZeroMemory(pmstr, sizeof(char)*(nstrLen + 1));
    // 转换字符串
    nstrLen = WideCharToMultiByte(nCodePage, 0, str, wcslen(str), pmstr, nstrLen, NULL, NULL);
    // 添加结尾
    pmstr[nstrLen] = 0;
    return pmstr;
}

USES_CONVERSION;/W2A
CW2A