2010-09-22

MultiByte と WideChar の変換について

何回もやっちゃったので、一応ノートを書いておきます。

MSDN:
MultiByteToWideChar()
WideCharToMultiByte()

使う例:

char before[]="変換前";
WCHAR wcAfter[1024];
char mbAfter[1024];

MultiByteToWideChar(CP_UTF8, NULL, before, -1, wcAfter, 0);

WideCharToMultiByte(CP_UTF8, NULL, wcAfter, -1, mbAfter, 0, NULL, NULL);

一般の文字列の場合、TEXT("使いたい文字")を使ったほうが便利かも。

どうやら、WideCharToMultiByteの場合がやや面倒くさい。

Windows Vista以降のプログラム注意点

なんか面倒くさいことになりました。

http://msdn.microsoft.com/ja-jp/windows/dd871151.aspx

とりあえずWTSSendMessage()を使って何とかしようかなぁ

2010-09-16

深入淺出MFC 2e 學習筆記: 第一章Generic

以下是自己在Windows 7中的Visual Studio 2008下編譯Generic所遇到的問題與解決方案

Generic.mak:
這個檔案年代已經久遠,當中所使用之某些編譯工具在現在最新的vs2008已經不再提供(如rc),所以放棄不用...



Generic.h(書中code)。有稍加修改
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);




Generic.cpp(書中為.c)

#include <windows.h>
#include "resource.h"
#include "generic.h"

HINSTANCE _hInst;
HWND _hWnd;

char _szAppName[] = "Generic";
char _szTitle[] = "Generic Sample Application";


int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
       MSG msg;

       UNREFERENCED_PARAMETER(lpCmdLine);

       if(!hPrevInstance)
               if(!InitApplication(hInstance))
                       return (FALSE);

       if(!InitInstance(hInstance, nCmdShow))
               return (FALSE);

       while(GetMessage(&msg, NULL, 0, 0)) {
               TranslateMessage(&msg);
               DispatchMessage(&msg);
       }

       return (msg.wParam);
}

BOOL InitApplication(HINSTANCE hInstance)
{
       WNDCLASS wc;

       wc.style = CS_HREDRAW | CS_VREDRAW;
       wc.lpfnWndProc = (WNDPROC)WndProc;
       wc.cbClsExtra = 0;
       wc.cbWndExtra = 0;
       wc.hInstance = hInstance;
       wc.hIcon = NULL;
       wc.hCursor = LoadCursor(NULL, IDC_ARROW);
       wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
       wc.lpszMenuName = "GenericMenu";
       wc.lpszClassName = _szAppName;

       return (RegisterClass(&wc));
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
       _hInst = hInstance;

       _hWnd = CreateWindow(
               _szAppName,
               _szTitle,
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT,
               CW_USEDEFAULT,
               CW_USEDEFAULT,
               CW_USEDEFAULT,
               NULL,
               NULL,
               hInstance,
               NULL
               );

       if(!_hWnd) return (FALSE);

       ShowWindow(_hWnd, nCmdShow);
       UpdateWindow(_hWnd);
       return (TRUE);
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
       int wmId, wmEvent;

       switch(message){
               case WM_COMMAND:
                       wmId = LOWORD(wParam);
                       wmEvent = HIWORD(wParam);

                       switch(wmId){
                               case IDM_ABOUT:
                                       DialogBox(_hInst, "AboutBox", hWnd, (DLGPROC)About);
                                       break;
                               case IDM_EXIT:
                                       DestroyWindow(hWnd);
                                       break;
                               default:
                                       return (DefWindowProc(hWnd, message, wParam, lParam));
                       }
                       break;

               case WM_DESTROY:
                       PostQuitMessage(0);
                       break;

               default:
                       return (DefWindowProc(hWnd, message, wParam, lParam));
       }
       return (0);
}

LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
       UNREFERENCED_PARAMETER(lParam);

       switch(message){
               case WM_INITDIALOG:
                       return (TRUE);
               case WM_COMMAND:
                       if(LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) {
                               EndDialog(hDlg, TRUE);
                               return (TRUE);
                       }
                       break;
       }
       return (FALSE);
}





Generic.rc(書中code)。以VS產生之原始檔,最後加入書中code
// Microsoft Visual C++ で生成されたリソース スクリプトです。
//
#include "windows.h" // 增加這行
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE 2 リソースから生成されました。
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 英語 (米国) リソース

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
LANGUAGE 17, 1
#pragma code_page(932)

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE
BEGIN
   "resource.h\0"
END

2 TEXTINCLUDE
BEGIN
   "#include ""afxres.h""\r\n"
   "\0"
END

3 TEXTINCLUDE
BEGIN
   "\r\n"
   "\0"
END

#endif    // APSTUDIO_INVOKED

#endif    // 英語 (米国) リソース
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE 3 リソースから生成されました。
//


/////////////////////////////////////////////////////////////////////////////
#endif    // APSTUDIO_INVOKED でない場合


// 以下為自己加入
GenericMenu MENU DISCARDABLE
BEGIN
       POPUP "&File"
       BEGIN
               MENUITEM "&New",        IDM_NEW, GRAYED
               MENUITEM "&Open...", IDM_OPEN, GRAYED
               MENUITEM "&Save",       IDM_SAVE, GRAYED
               MENUITEM "Save &As...", IDM_SAVEAS, GRAYED
               MENUITEM SEPARATOR
               MENUITEM "&Print...", IDM_PRINT, GRAYED
               MENUITEM "P&rint Setup...", IDM_PRINTSETUP, GRAYED
               MENUITEM SEPARATOR
               MENUITEM "E&xit",       IDM_EXIT
       END
       POPUP "&Edit"
       BEGIN
               MENUITEM "&Undo\tCtrl+Z", IDM_UNDO, GRAYED
               MENUITEM SEPARATOR
               MENUITEM "Cu&t\tCtrl+X", IDM_CUT, GRAYED
               MENUITEM "&Copy\tCtrl+C", IDM_COPY, GRAYED
               MENUITEM "&Paste\tCtrl+V", IDM_PASTE, GRAYED
               MENUITEM "Paste &Link", IDM_LINK, GRAYED
               MENUITEM SEPARATOR
               MENUITEM "Lin&ks...", IDM_LINKS, GRAYED
       END
       POPUP "&Help"
       BEGIN
               MENUITEM "&Contents", IDM_HELPCONTENTS, GRAYED
               MENUITEM "&Search for Help on...", IDM_HELPSEARCH, GRAYED
               MENUITEM "&How to Use Help", IDM_HELPHELP, GRAYED
               MENUITEM SEPARATOR
               MENUITEM "&About Generic...", IDM_ABOUT
       END
END

AboutBox DIALOG DISCARDABLE 22, 17, 144, 75
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "About Generic"
BEGIN
       CTEXT           "Windows 95", -1, 0, 5, 144, 8
       CTEXT           "Generic Application", -1, 0, 14, 144, 8
       CTEXT           "Version 1.0", -1, 0, 34, 144, 8
       DEFPUSHBUTTON "OK", IDOK, 53, 59, 32, 14, WS_GROUP
END





resource.h 原本應該是rc根據generic.rc生成。但是VS笨笨的,所以還是自己修改吧
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by generic.rc

// 自己加入部分START
#define IDM_NEW                                 201
#define IDM_OPEN                                202
#define IDM_SAVE                                203
#define IDM_SAVEAS                              204
#define IDM_PRINT                               205
#define IDM_PRINTSETUP                  206
#define IDM_EXIT                                207
#define IDM_UNDO                                208
#define IDM_CUT                                 209
#define IDM_COPY                                210
#define IDM_PASTE                               211
#define IDM_LINK                                212
#define IDM_LINKS                               213
#define IDM_HELPCONTENTS                214
#define IDM_HELPSEARCH                  215
#define IDM_HELPHELP                    216
#define IDM_ABOUT                               217
//#define IDOK                                  300
//#define IDCANCEL                              301
// 自己加入部分END

// 新しいオブジェクトの次の既定値
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        101
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif




VS2008,打開一個新的win32程式用新專案,內容用空白
自己把上面這幾個檔案加入/修改之後就能編譯了
理論上,加入generic.rc的時候,resource.h檔案就會被自動生成,可是內容就點點點了

如果編譯出現囉嗦的字眼之類的,應該是編碼問題
把專案的編碼從UNICODE(預設)改成用多字元編碼就沒事了

2010-09-09

Windows 32bit プログラムを 64bit用に変更するときの注意点。

x64環境のSDKを使ってコンパイルするときに、GWL_WNDPROCなどシステムの定数が使えないことになります。

それは、SDKでは、x64環境であれば(#ifdef _win64)、それらの変数の定義をキャンセルした(undef)のです。

解決法として、GWL_WNDPROCを使った関数(GetWindowLong()/SetWindowLong())などをポインタを使うように変わること。
GetWindowLong() -> GetWindowLongPtr()

そして、GWL_WNDPROC -> GWLP_WNDPROC

としたら、x64環境でも無事に使えるようになります

もし同じコードを32bit環境での実行に心配を持つなら、
#ifdef _win64
  // 64bitコード
#else
  // 32bitコード

Credential Provider

Windows Vista 以降ログイン画面をカストマイズしたい場合いじるプログラムである。

しかし、何かの原因で、Microsoft自分が最初にリリースしたサンプルプログラムのBETAにはバッグが隠れている。それはSimpleHardwareEventCredentialProviderの中のMessageCredential.hにある。そのファイルの最後にあるSFI_NUM_FIELDSSMFI_NUM_FIELDSに訂正しないと、64bitのOSで実行すると、メモリアクセスエラーになって、LogonUIがクラッシュすることが起こってしまう。そのバッグはFinalリリースに修正されたが、万が一BETAを基づいて作ったプログラムであれば、見直したほうがいいと思う。

結構悩ませたので、ここに記入して置く。
誰かの助けになるといいと思う。

keyword: Credential Provider, 64bit

2010-09-07

NS-3

最終的にNS-2が廃棄されるので、
今とこで、NS-3のドキュメントを読みながら訳しています
時間があれば、ここに拙者の訳を置きます

最初の作品はns本部のdev版のチュートリアルhttp://www.nsnam.org/docs/tutorial.htmlに沿って訳していきます
前後矛盾だらけの訳になれないように頑張ります

では

32bit & 64bit programming

If u make a program that can run on a 32-bit OS, in most case, all u
have to do is rebuild it for 64-bit environment.

u can compile a 64-bit program on 32-bit environment. All u have to do
is get the compiler and Libraries for 64-bit program.

Some of the 32-bit programs cannot run corrently on 64-bit OS, so u
have to rebuild(recomile) it for running on 64-bit OS.

Good luck, anyway.

GoogleCode-Prettify

SyntaxHighlighter

人気の投稿