猫的新窝

止心,少语,莫愁

正在浏览 C/C++ 里的文章

看到galaxy的《在Win下用软件关闭显示器电源》,得到启发后,google到了比较真的真相。

下载: a.cpp
  1. #include <windows.h>
  2. int main(void)
  3. {
  4.     // Eliminate user''s interaction for 500 ms
  5.     Sleep(500);
  6.     // Turn off monitor
  7.     SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 2);
  8.     // Turn on monitor
  9.     // SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) -1);
  10.     // Low power monitor
  11.     // SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM) 1);
  12.     return 0;
  13. }

另外看到个比较悲剧而和我无关的消息,iphone新的SDK明确的拒绝了第三方的,或者跨平台工具,语言。.
沧桑的传送门->>>>>点击这里

int main
{
// 初始化mfc环境
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
return 1;
}
HINSTANCE hIns = GetModuleHandle(NULL);
//初始化资源
AfxSetResourceHandle(hIns);

………….
/*CWaitCursor wc;*/ //Abort…
HINSTANCE hIns = GetModuleHandle(NULL);
HCURSOR cur = LoadCursor(hIns,IDC_WAIT);
HCURSOR hOldCursor = SetCursor(cur);
ShowCursor(TRUE);
…………………
SetCursor(hOldCursor);

AfxWinTerm();
}

wince 按键处理

抢板凳

现在的智能机的键盘越来越小,而屏幕越来越大,相应的,代码中处理Mouse的代码远远大于keyboard的代码,结果呢,偶尔遇到几台按键多的机器(甚至全键盘+多媒体键盘,真佩服这手机设计的),就很郁闷了。

原来程序设计是接管所有系统的按键信息,结果山寨机越来越多,每个山寨机都有点自己的亮点按键的话,光光键盘部分各家处理函数就要郁闷了。
继续阅读

_open_osfhandle Associates a C run-time file handle with a existing operating-system file handle.

  1. int   nHandle   =   _open_osfhandle((intptr_t)hFile,   _O_TEXT)
  2. if   (nHandle   !=  INVALID_HANDLE_VALUE) 
  3.     return   _fdopen(nHandle,   szMode)
  4. else 
  5.     return   NULL;

继续阅读

测试多线程程序,或者Data Abort这种比较难找的bug时,log是帮忙解决问题的利器。
但是,log信息输出过多,则应该调试效率(既影响程序运行效率,ce设备输出到设备上还是很影响程序效率的,再者也影响了看log的效率)
一般做法是,分级输出debug信息,针对CE设备,启动调试一次需要花费大量的时间。所以优化为动态分级控制debug信息。
继续阅读

同步方式较为简单:
以下载一个文件为例,我们来看看同步的做法:
1)InternetOpen;
2)InternetOpenUrl;
3)HttpQueryInfo;
4)InternetReadFile;
5)InternetCloseHandle。
继续阅读

今天遇到修改以前自动更新模块,遇到个WinInet重定向的问题(现在想想,可能不是重定向造成的),如果获得重定向后的url地址?

在异步模式下
通过回调函数InternetStatusCallback中的
dwInternetStatus ==INTERNET_STATUS_REDIRECT捕获重定向信息,并且同时lpvStatusInformation参数就是个指向新地址的以NULL结尾的新url地址

继续阅读

写了个dll给c#组提供借口,今天反映一直返回值错误。
调了一个多小时,发现原来字符串路径传递的问题

我定义的接口是:

DLLFUN int SeparateNdb(void *handle,const wchar_t* const wszFilename,const wchar_t* const szSaveDir,TProcessProc callBackProcessProc = 0);

原来在c#写为

[DllImport("ndbSeparate.dll", EntryPoint = "SeparateNdb")]
        private static extern int SeparateNdb(IntPtr handle,
            string wszFilename,
            string szSaveDir,
            IntPtr callBackProcessProc);

继续阅读

wince较之win32在文件系统上有较大区别(废话)
主要体现和需要主意有:

wince上API居多(基本,我没见过)采用绝对路径。所以采用相对路进遇到问题,先考虑路径问题。

模拟器的存储卡文件系统有问题,所以只能读不能写,需要log或者数据库保存文件,请注意路径。

wince下,文件名确实比较随意,某些乱码字符都能当文件名,特别是window mobile的兼容性极佳,不过如果考虑到可移植性,建议对文件名需要规定一些过滤规则的,比如M8的就比较挑剔些。当初折腾一个晚上的问题就是出在这边。

CWnd和HWND

抢沙发

win32API居多第一个参数都是HWND的类型,在我的模块中,为了方便的移植到各平台上,尽量采用HWND的类型。
但是,渐渐发现由于函数中穿插着较多的return的异常处理(-___- 终于理解为什么面向过程提倡单入口,单出口,也理解了为什么goto会流行。。。),采用CDC比HDC相比,确实可以少考虑不少DeleteDC泄漏的问题。
而CWindowDC需要一个CWnd的指针。HWND–>CWnd的相互转化就必须弄清楚。

从CWnd获得HWND是比较easy的方法,直接GetSafeHWnd()就好了,而HWND—>CWnd则有两种方法,Attach和FromHandle
区别下两者的:
Attach是把当前CWnd挂到HWND上(原来的HWND呢?MSDN好象没说),然后用Detach断开两者连接。
相比而言,FromHandle的使用更加简单一些,返回的CWnd*也不需要你自己维和,系统在Idle time自动调用DeleteTempMap 来释放这些临时的CWnd。
也就是说,FromHandle返回的CWnd*有效生命期可能只有你这个函数体内,而如果你需要长期有效的CWnd对象,必须使用Attach。当然那生命期也要你自己维护了。

CDC和HDC的转换类似。