知识点杂记

来源:互联网 发布:阿里云备案照片 编辑:程序博客网 时间:2024/06/06 06:59

记录的目的是为了下次使用时,无需再去搜索,能有一个更深的印象。


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_uiTimeTimeValue类型不一致。左边的值可能会不对。所以需要对一个值先进行强制类型转换。

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,&notify);

7. 验证WindowsSleep函数的精确度,判断出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. VSIntermediate Directory造成的链接问题:(转)

项目的整个解决方案里面有较多个工程。有些是用CMake生成,有些是手动建的,还没有来得及改成CMake。升级成2012后,出现了诡异的问题。工程A依赖工程B,工程B依赖工程C。无论是用VS还是Incredibuild,链接A的时候都提示找不到Blib。先以为是编译顺序的问题,发现不是。然后以为是B编译失败了,但是又没有Error信息。仔细查找,在链接A报错的时候,确实没有生成出BC。发现BC里面有些名字相同的文件,而两个工程的Intermediate Directory指向了同一个文件夹。因此怀疑是多线程编译的时候,对同名obj文件处理的问题。把BC的中间目录改成不一样即可。

注意:不同工程使用的中间目录要分开;或者最好都用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.libdwrite.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);

0 0