记录的目的是为了下次使用时,无需再去搜索,能有一个更深的印象。
1. DLL编写中,获取该DLL的实例句柄GetModuleHandle(L"DLL名称")。
2. 隐藏鼠标:
do {
iRet = ShowCursor(FALSE);
} while (iRet>=0);返回值>=0时,鼠标显示,在使用时,ShowCursor一次,返回值并不一定会规律递减或递增。
3. 出现fopen不安全类似的,右击工程 - 属性- 配置属性 -C/C++ - 命令行,在其后加入命令: /D _CRT_SECURE_NO_WARNINGS.
4. 类型不一致,在进行+-*/运算时如果作为判断值进行判断会导致结果错误。类似:
If((1000* m_uiTime - TimeValue) > 0); m_uiTime 与TimeValue类型不一致。左边的值可能会不对。所以需要对一个值先进行强制类型转换。
5. 在WIC调用中,打开了一个文件创建了解码文件,并不需要去关闭,只需在函数结束时,释放创建的变量,如果有单个变量遗忘释放,编译并不会出错。但是会造成文件一直被打开,无法关闭,对其进行操作。
6.设置托盘图标时,导入应用程序实例:GetWindowLongPtr(hWnd, -6);该函数返回应用实例句柄或指针。用GetWindowLong(hWnd, -6);该函数返回应用实例信息。
// 设置托盘程序
hInstance =(HINSTANCE)GetWindowLongPtr(hWnd, -6); // (HINSTANCE)GetWindowLong(hWnd,-6);获取不到句柄
hMenu= LoadMenu(hInstance,MAKEINTRESOURCE(IDR_TRAYMENU));
hMenu = GetSubMenu(hMenu,0);
notify.cbSize = sizeof(NOTIFYICONDATA);
notify.hWnd = hWnd;
notify.uID = IDR_TRAYMENU;
notify.uFlags =NIF_MESSAGE | NIF_ICON | NIF_TIP;
notify.uCallbackMessage = WM_NOTIFYICON;
notify.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TRAY_ICON);
lstrcpyn(notify.szTip,L"PowerViewer", sizeof(notify.szTip));
Shell_NotifyIcon(NIM_ADD,¬ify);
7. 验证 Windows 中 Sleep 函数的精确度,判断出 GetSystemTime 函数的精度要比 timeGetTime 高。 Sleep 函数也相对比较精确。针对毫秒级。DWORD time1,time2;
SYSTEMTIME sysTime1, sysTime2;
while (1)
{
//timeBeginPeriod(1);//设置系统精确到1秒
time1 = timeGetTime();
//GetSystemTime(&sysTime1);
//timeEndPeriod(1);//每个timeBeginPeriod对应一个timeEndPeriod取消提高精确度
Sleep(5);
//timeBeginPeriod(1);
time2 = timeGetTime();
//GetSystemTime(&sysTime2);
//timeEndPeriod(1);
time1 = time1 + 5;
if (time1!=time2)
{
return 0;
}
//sysTime1.wMilliseconds =sysTime1.wMilliseconds + 5;
//if(sysTime1.wMilliseconds>=1000)
//{
// sysTime1.wMilliseconds%= 1000;
// if(sysTime1.wMilliseconds!=sysTime2.wMilliseconds)
// {
// return0;
// }
//}
}
8. VS中Intermediate Directory造成的链接问题:(转)
当项目的整个解决方案里面有较多个工程。有些是用CMake生成,有些是手动建的,还没有来得及改成CMake。升级成2012后,出现了诡异的问题。工程A依赖工程B,工程B依赖工程C。无论是用VS还是Incredibuild,链接A的时候都提示找不到B的lib。先以为是编译顺序的问题,发现不是。然后以为是B编译失败了,但是又没有Error信息。仔细查找,在链接A报错的时候,确实没有生成出B和C。发现B和C里面有些名字相同的文件,而两个工程的Intermediate Directory指向了同一个文件夹。因此怀疑是多线程编译的时候,对同名obj文件处理的问题。把B和C的中间目录改成不一样即可。
注意:不同工程使用的中间目录要分开;或者最好都用CMake来配置。
9. 调试VS报错:Parameter "basepath" cannot be a relative path. 表示调试路径需要设置成绝对路径,不能设置成相对路径。
10. (1)、errorLNK2019: unresolved external symbol _D2D1CreateFactory@16 referenced infunction "long __cdecl D2D1CreateFactory(enum D2D1_FACTORY_TYPE,struct_GUID const &,void * *)" (?D2D1CreateFactory@@YAJW4D2D1_FACTORY_TYPE@@ABU_GUID@@PAPAX@Z)
解决办法:D2D所需静态库在编译时未及时加入,在Project->Properties->ConfigurationProperties->Linker->Input->Additional Dependencies中加入d2d1.lib、dwrite.lib等即可。
(2)、errorLNK2001: unresolved external symbol _IID_IWICImagingFactory
解决办法:Project->Properties->ConfigurationProperties->Linker->Input->Additional Dependencies 中加入windowscodecs.lib即可。
11.根据GetLastError()返回值弹出错误信息,方便修复。
DWORD dw = GetLastError();
LPVOID lpMsgBuf;
FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL);
MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK);
LocalFree(lpMsgBuf);