• ベストアンサー

lpszCPを取り出したい

Winアプリにファイルをドラッグしてファイル名を取るために下記のような記述をして一応取り出せたのですが str_argにような外部変数を利用するよりも正当なやり方はないのですか? 例えばメッセージのメンバに格納されている場合にはそれを使うとか・・・ よろしくお願いします string str_arg; LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP); WINAPI WinMain(HINSTANCE hI,HINSTANCE hPI,LPSTR lpszCP,int nCS) { WNDCLASS wc; HWND hW; MSG ms; str_arg=lpszCP;

  • nubou
  • お礼率62% (293/470)

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

コマンドラインはGetCommandLineで取得することが出来ます。 参考までに、ウィンドウを持つアプリでグローバル変数を使わない正当な方法を書いておきますね。 1.RegisterClassで、cbWndExtraの値を0以外(4バイトがいいでしょう)にして拡張領域を確保してウィンドウクラスを登録する。 2.CreateWindowのlpvParamにlpszCPを渡し、WM_CREATEで受け取ったときにSetWindowLongでlpszCPのアドレスを拡張領域にセットする。 3.各メッセージをうけてウィンドウプロシージャが呼ばれたときは、GetWindowLongでアドレスを取得して使用する。 とすれば、グローバル変数は不要です。

nubou
質問者

お礼

GetCommandLineで問題は完全に解決しました どうもありがとうございました

その他の回答 (1)

  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

この場合のlpszCPはコマンドプロンプトですよね。これを取得したいのであればやはりこの方法しかないと思います。 ウインドウに対してドラッグ・アンド・ドロップされたファイル名の取得は...googleなどで「ドラッグ vc」のような語で検索をすればたくさんヒットします。それらを参考にしてはどうでしょうか。

nubou
質問者

お礼

やはりWinProcedureに渡すためにはこの方法しかないのですね? ありがとうございました

関連するQ&A

  • 1つだけしか起動しないアプリを作りたい

    下のようにして1つだけしか起動しないアプリを以前(Borland C++4.0で)作っていてうまく動いていたのですが 無償Borland C++5.5ではうまくいきません 調べてみるとhPIが2つ目以降のクローンについても0なのです hPIが使えないとすると他にどんな方法があるのでしょうか? WINAPI WinMain(HINSTANCE hI,HINSTANCE hPI,LPSTR lpszCP,int nCS) { WNDCLASS wc; HWND hW; MSG ms; if(hPI!=NULL)return(0);

  • void main(void){...}だとDosWindowが開くので

    わざわざWindowsアプリにして以下のようにするしかないのでしょうか? LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { //ここに宣言を置く switch(wM) { case WM_CREATE: //ここに処理を置く return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS) { WNDCLASS wc; HWND hW,hPW; MSG ms; wc.lpszClassName ="goo"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =NULL; wc.cbWndExtra =NULL; wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =NULL; RegisterClass(&wc); hW=CreateWindow ( "goo", "教えて!goo", WS_OVERLAPPED, 0, 0, 640, 456, NULL, NULL, hI, NULL ); ShowWindow(hW,nCS); UpdateWindow(hW); while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); } もっと簡単にDosWindowが開かないようにする方法はないのでしょうか? もしないとすると上記記述でもっと簡単にできないでしょうか?

  • 2重起動を防ぐために

    WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW; MSG ms; HANDLE hMutex; hMutex=CreateMutex(NULL,TRUE,"UniqueName"); if(!hMutex)return FALSE; if (GetLastError()==ERROR_ALREADY_EXISTS)return FALSE; とすればよいいうサイトがあります。 こうした後、最終的にこのアプリを終了するときMutexを閉じる必要はあるのでしょうか。 アプリの終了で自動的に閉じられるから何もしなくてよいのでしょうか教えてください。

  • 再起動したとき前起動分を強制終了するには?

    WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS) { WNDCLASS wc; HWND hW; MSG ms; wc.lpszClassName ="goo"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =NULL; wc.cbWndExtra =NULL; wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =NULL; RegisterClass(&wc); hW=CreateWindow ( "goo", "教えてgoo", WS_OVERLAPPED|WS_CAPTION|WS_THICKFRAME |WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_SYSMENU, 0, 0, 640, 480, NULL, NULL, hI, NULL ); ShowWindow(hW,nCS); UpdateWindow(hW); while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); } のプログラムが2回目に起動したとき1回目の起動を強制終了するにはどうしたらいいのでしょうか?

  • 再起動時、前起動分のハンドルを得る方法は?

    WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int nCS) { WNDCLASS wc; HWND hW; MSG ms; //ここで前起動クローンのアプリやWindowのハンドルを取得したい wc.lpszClassName ="goo"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =NULL; wc.cbWndExtra =NULL; wc.hIcon =LoadIcon(NULL,IDI_EXCLAMATION); wc.hCursor =LoadCursor(NULL,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =NULL; RegisterClass(&wc); hW=CreateWindow ( "goo", "教えてgoo!", WS_OVERLAPPED|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU, 0, 0, 640, 456, NULL, NULL, hI, NULL ); ShowWindow(hW,nCS); UpdateWindow(hW); while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); } 上記アプリで//行で前起動時のWindowのハンドルを得るにはどうしたらいいのでしょうか?

  • 2重軌道防止のサイトの説明

    に従って以下のようにしましたが 2重起動を発見してやめるために return false; としていますが return true; としたり booleanをやめて return int(0) とするとどうなるのでしょうか? WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; HWND hW,hPW; MSG ms; unsigned pos; HANDLE hMutex; hPW=FindWindow("goo","I am good."); hMutex=CreateMutex(NULL,TRUE,"UniqueName"); if(!hMutex)return FALSE; if (GetLastError()==ERROR_ALREADY_EXISTS) { ShowWindow(hPW,SW_RESTORE); SetForegroundWindow(hPW); return FALSE; } ・・・・・・・・・・・・・・・・・・・・

  • プログラムを終わらせてください。

    下のプログラムが終わらなくて困っています。 終わらせる方法を教えてください。 #include <windows.h> #pragma argsused HWND hWmain; DWORD WINAPI Th(LPVOID) { char s[99]; for(unsigned i=0;i<4294967295;i++) SetWindowText(hWmain,itoa(i++,s,10)); return 0; } LONG WINAPI WinProcedure(HWND hW,UINT wM,UINT wP,LONG lP) { static HANDLE hTh; DWORD thId; DWORD ExitCode; switch(wM) { case WM_CREATE: hTh=CreateThread(0,0,Th,0,0,&thId); return 0; case WM_DESTROY: GetExitCodeThread(hTh,&ExitCode); ExitThread(ExitCode); if(hTh!=0)CloseHandle(hTh); PostQuitMessage(0); return 0; default: return(DefWindowProc(hW,wM,wP,lP)); } } WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { WNDCLASS wc; MSG ms; wc.lpszClassName ="Q"; wc.lpfnWndProc =(WNDPROC)WinProcedure; wc.hInstance =hI; wc.style =CS_HREDRAW|CS_VREDRAW; wc.cbClsExtra =0; wc.cbWndExtra =0; wc.hIcon =LoadIcon(hI,0); wc.hCursor =LoadCursor(0,IDC_ARROW); wc.hbrBackground =(HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName =0; RegisterClass(&wc); hWmain=CreateWindow("Q","",WS_OVERLAPPEDWINDOW,0,0,99,99,0,0,hI,0); ShowWindow(hWmain,SW_SHOW); UpdateWindow(hWmain); while(GetMessage(&ms,0,0,0)) { TranslateMessage(&ms); DispatchMessage(&ms); } return (ms.wParam); }

  • 何もしないメッセージだけ表示するウィンドウ

    ゲーム用に何もしないメッセージだけ表示するウィンドウを作りたいのですが、 猫でもわかるゲームプログラミングのコードが間違っているのか、 機能しません。 #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp); int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow) { return (int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { switch (msg){ } return 0; } このように、打ち込んだのですが、どこが間違っているのか解りません。 回答お願いいたします。

  • HINSTANCEの型

    LPSTR は char* なので、 int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , LPSTR lpCmdLine ,int nCmdShow ) を int WINAPI WinMain(HINSTANCE hInstance ,HINSTANCE hPrevInstance , char* lpCmdLine ,int nCmdShow ) と書き換えてもコンパイルできます。 HINSTANCEはvoid *型だという記述を見たのですが、void *で書き換えてもエラーがでてしまいます。 どうしたらよいのでしょうか。

  • ブレイクポイントについて

    #include <windows.h> LRESULT CALLBACK WndProc( HWND , UINT, WPARAM, LPARAM ); LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR , int nCmdShow ) { MSG msg; HWND hWnd, hWnd3; WNDCLASSEX wndclass,c_wndclass; wndclass.style = 0; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "wh02"; c_wndclass.style = 0; c_wndclass.lpfnWndProc = WndProc1; c_wndclass.cbClsExtra = 0; c_wndclass.cbWndExtra = 0; c_wndclass.cbSize = sizeof(WNDCLASSEX); c_wndclass.hInstance = hInstance; c_wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ); c_wndclass.hIconSm = LoadIcon( NULL, IDI_WINLOGO ); c_wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); c_wndclass.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); c_wndclass.lpszMenuName = NULL; c_wndclass.lpszClassName = "wh01"; if(! RegisterClassEx( &wndclass )) return 0; // ウィンドウクラスの登録 if(! RegisterClassEx( &c_wndclass )) return 0; // ウィンドウクラスの登録 // できないと終了   hWnd = CreateWindow( "wh02", "親ウインドウ(WS_OVERLAPPEDWINDOW)", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, // 親ウィンドウはデスクトップ NULL, hInstance, NULL ); hWnd2 = CreateWindow( "hWnd1", "親ウインドウの子", WS_OVERLAPPEDWINDOW , CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hWnd, // 親ウィンドウの子 NULL, hInstance, NULL ); ShowWindow( hWnd, nCmdShow ); UpdateWindow( hWnd ); ShowWindow( hWnd2, nCmdShow ); UpdateWindow( hWnd2 ); while( GetMessage( &msg, NULL, 0, 0 ) ){ TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam ; } LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { default: ブレイクポイント3return DefWindowProc( hWnd, iMessage, wParam, lParam ); } return 0; } LRESULT CALLBACK WndProc1( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { case WM_DESTROY: ブレイクポイント1postQuitMessage(0); break; ブレイクポイント2return DefWindowProc( hWnd, iMessage, wParam, lParam ); } のプログラムを組んで実行して、ブレークポイントでやったのですがまず親ウィンドウの終了ボタンを押したらブレイクポイント1が通り、次にブレイクポイント2が通りここまではいいのですがブレイクポイント3が三回繰り返して実行されるのですが、なぜ三回繰り返されるのでしょうか?

専門家に質問してみよう