声明一个指针函数,其名必须为.dll中的函数名。
此指针类型的函数名必须在方法体内开始的地方进行声明,否则为提示类型不能用于表达式,“将此类型用作表达式非法".
=============================
1.OnMouseOver, CBrightnessRevise.不明白会起什么样的作用。
2.设置窗体位置函数,SetWindowPos(),HWND hWndlnsertAfter=NULL, why?
需要练习的代码:
1。BOOL CDialogBase::GetFolder(LPTSTR szSelectedFolder,LPCTSTR szTitle,const HWND hOwner,LPCTSTR szRootFolder,LPCTSTR szStartFolder)
{
LPITEMIDLIST lpID;
BROWSEINFO bi;
bi.hwndOwner=hOwner;
if(szRootFolder==NULL)
bi.pidlRoot=NULL;
else{
LPITEMIDLIST pIdl=NULL;
IShellFolder* pDesktopFolder;
WCHAR wzPath[MAX_PATH];
ULONG chEaten;
ULONG dwAttributes;
if(SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder))){
#ifndef UNICODE
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szRootFolder,-1,wzPath,MAX_PATH);
#else
lstrcpy(wzPath,szRootFolder)
#endif
pDesktopFolder->ParseDisplayName(NULL,NULL,wzPath,&chEaten,&pIdl,&dwAttributes);
pDesktopFolder->Release();
}
bi.pidlRoot=pIdl;
}
bi.pszDisplayName=szSelectedFolder;
bi.lpszTitle=szTitle;
bi.ulFlags=BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT;
bi.lpfn=BrowseCallbackProc;
bi.lParam=(LPARAM)szStartFolder;
bi.iImage=NULL;
//选择一个shell文件夹
lpID=SHBrowseForFolder(&bi);
if(lpID!=NULL && SHGetPathFromIDList(lpID,szSelectedFolder))
return TRUE;
return FALSE;
}
RedrawWindow()NULL, last
this.day.close();
==============================================
SendFile(REDM_COMMAND_WRITE_HUB_PARAM,szPath), REDM_COMMAND_WRITE_HUB_PARAM似乎是个未定义常量
_stscanf()有点难度.
HKEY hKey;
BYTE n,count;
TCHAR szValueName[MAX_PATH];
TCHAR szValueData[16];
DWORD cbValueName,dwType,cbData;
INT nPort;
count=0; ///注册键的句柄 ///要打开的子键 reserver /访问权限 //保存打开的句柄
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE//DEVICEMAP//SERIALCOMM"),0,KEY_READ,&hKey)==ERROR_SUCCESS){
cbValueName=MAX_PATH;
cbData=sizeof(szValueData); ///保存值名的buf. 保存值的类型 //键的值
for(n=0;count<nCount && RegEnumValue(hKey,n,szValueName,&cbValueName,NULL,&dwType,(LPBYTE)szValueData,&cbData)==ERROR_SUCCESS;n++){
if(dwType!=REG_SZ/* || cbValueName<15*/)
continue;
//_tcsupr(szValueName);
//if(_stscanf(szValueName,_T("//DEVICE//SERIAL%d"),&nPort)<=0 || nPort>255)
// continue;
///把键值名转换成大写的
_tcsupr(szValueData);
if(_stscanf(szValueData,_T("COM%d"),&nPort)<1 || nPort>256)
continue;
pCommList[count++].nPort=(USHORT)nPort;
cbValueName=MAX_PATH;
cbData=sizeof(szValueData);
}
RegCloseKey(hKey);
}
枚举串口,CLEDAutoAdjust::EnumSerialComm()使用了注册表设备映射键值对。但这没有考虑用户在不同类型帐户下运行该程序可能会产生的不可访问问题。我有更好的方法,使用未公开的API
又发生了一个类中方法调用的循环,这应该避免,否则出现错误,异常地难以找到问题所在,也容易出错。
OnColorOrderUpdate()-->OnRGBUpdate()-->OnColorOrderUpdate(). 这是一个循环。
this->day.close();