绵绵's profile我讨厌强力党PhotosBlogLists Tools Help

Blog


    4/28/2006

    Unicode in MFC

    这个标题太大了,其实我没搞懂,就是找了一些解决方法
    1.想在MFC中使用Unicode
        教科书上说要定义UNICODE和_UNICODE两个宏,前者用于windows.h,后者用于c运行期头文件,但是你会发现在你的程序中写:
    #ifndef UNICODE
    #define UNICODE
    #endif
    #ifndef _UNICODE
    #define _UNICODE
    #endif
    是没有用的!必须在Preprocessor definition里面定义这两个宏,sizeof(TCHAR)才等于2!为什么不知道,哪位大牛来讲一下这两种定义方式有什么不同?
        定义这两个宏之后你会发现你的MFC工程会出一个LINK错误:

    msvcrt.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

    找不到MFC程序的入口函数WinMain,解决办法是在ProjectSettings->link->output把Entry设置为wWinMainCRTStartup。据说这是VC6.0的一个bug,但是我用的是.NET 2003,看来微软发现这个问题不容易改啊。

        做完这两步之后不要忘了用TCHAR,_T,lstrcpy这些generic的宏,能同时支持ASCII和Unicode看着要高级点嘛。

    2.Unicode和CFile

    要在文件中写Unicode,英文没问题,但是写中文,你打开记事本看看会发现都是乱码,解决办法如下:

      CString path = _T("中文");
      CFile file;
      if(!file.Open(path, CFile::modeCreate|CFile::modeWrite)) return;    //我的函数返回类型是void

    #ifdef UNICODE
      WORD wSign = 0xFEFF;    //typedef unsigned short WORD
      file.Write(&wSign, 2);

    #endif
      file.Write(str, str.GetLength()*sizeof(TCHAR));
      file.Close();

    具体内部原因等我研究一下再来接着写,嗯

    3.Unicode和Clipboard

    代码如下,顺便指出Clipboard的用法:

      if(OpenClipboard()){
        HANDLE clip = NULL;
        TCHAR  *buffer;
        EmptyClipboard();
        clip = GlobalAlloc(GMEM_MOVEABLE,(str.GetLength()+1)*sizeof(TCHAR)); //allocate memory
        if(clip != NULL){
           buffer = (TCHAR*)GlobalLock(clip); //lock the memory block, get the pointer
           lstrcpy(buffer, (LPCTSTR)str);
           GlobalUnlock(clip);  //unlock

    #ifdef UNICODE
           SetClipboardData(CF_UNICODETEXT, clip);

    #else

           SetClipboardData(CF_TEXT, clip);

    #endif
           GlobalFree(clip);
        }
        CloseClipboard();
      }else{
        AfxMessageBox(_T("Cannot open clipboard."));
      }

    剪贴板不用先写个什么头,直接copy就行了,估计这个事情SDK自己处理了,比文件好用多了。

    4/10/2006

    Win2K3主域控制器启动时停在“准备网络连接”

    问题解决了,是因为装了防火墙客户端,并且不是用于服务器的防火墙,但是原因不明白
    出现这种情况可以进入不带网络连接的安全模式,关闭并禁用一些不必要的服务,我觉得往往是指一些非系统服务,也就是可能导致问题的第三方服务。一般都是这个原因造成,如果还是出现无法进入系统的情况,并且不是因为机器配置过低的话,就去问微软吧