• ベストアンサー

GetModuleFileName(他のアプリ, buf, 255);

a-kumaの回答

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

GetModuleFileName() のヘルプを見ると、第一引数の型は HMODULE でモジュールハンドルを 渡すことになってます。 それなのにインスタンスハンドルを渡しているからエラーになっているのでしょう。 GetModuleFileName() 関数の戻り値と GetLastError() を使って詳細の情報を 取得して、ヘルプを参照して見てください。

A__
質問者

お礼

ありがとうございます。型を勘違いしていました。

関連するQ&A

  • CREATESTRUCT と GetWindowLong

    HINSTANCE hInst; CREATESTRUCT *lpcrea; lpcrea = (CREATESTRUCT *)lParam; hInst = lpcrea->hInstance; と HINSTANCE hInst; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); は、どういう意味なのか、どこが違うのか教えてください。 メインのウインドウのインスタンスをグローバル宣言して いなかった場合に、プロージャ内でメインのウインドウの インスタンスを得ているんだと思うんだけど、細かい部分の 説明をしてほしいです。

  • GetModuleFileNameでエラーが出てしまう。

    #include<windows.h> #include<string.h> // 関数のプロトタイプ宣言 VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime); BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam); // エントリポイント int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; EnumWindows((WNDENUMPROC)EnumWindowsProc,NULL); while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) { char Caption[201]; char FileName[1024]=""; char FindList[1][80]={"Microsoft Internet Explorer"}; GetWindowText(hwnd, Caption, 200); for(int i=0;i<=0;i++) if(NULL!=strstr(Caption,FindList[i])) { HINSTANCE hInst; hInst = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE); if(GetModuleFileName(hInst, FileName, 1023)!=0) { // ファイル名取得成功したときの動作 MessageBox(NULL,Caption,FileName,MB_OK|MB_SETFOREGROUND); }else{ MessageBox(NULL,Caption,"Error",MB_OK|MB_SETFOREGROUND); } } return true; } 実行するとIEが起動されてたらそのウインドウのキャプションとプログラム名を表示される予定なのですが、 GetModuleFileNameでエラーが返されます。 何が原因なのでしょう?

  • VC++コンソールアプリでのインスタンスハンドルの取得

    VC++コンソールアプリでのインスタンスハンドルの取得 VC++コンソールアプリケーションでインスタンスハンドルを取得しようとしているのですが、 HINSTANCE hi = (HINSTANCE)GetWindowLong(HWND_DESKTOP, GWL_HINSTANCE); を実行すると、NULLが戻ってきます。 どこかまずい部分があるのでしょうか。 なお、第一引数のウィンドウハンドルは不明なため、 いくつかのWebサイトに習い、HWND_DESKTOPを指定しました。

  • ハンドルからインスタンス?を取得したいのですが

    CreateWindowExを使いたいのですが 途中でインスタンス?(でいいのかな?)を指定するところが あるのですがどうしていいか困っています。 GetWindowLong(HWND,GWL_HINSTANCE); でとれるのかな?と思うのですが 返す値がLongです インスタンスにキャストすることなどできるのでしょうか? どのようにしたらいいのでしょうか? インスタンス自身もあまり意味が....... よろしくお願いいたします

  • ビットマップの描画について(Windowプログラミング)

    おせわになります。 現在WIndows上で動作するソフトを作成しています。 ほとんど作成は終わっているのですが、作成したWindowsの上にビットマップを描画する部分で不安な点があります。 (これまであまり手をつけていなかったので) ネットなどを参考に作成したのですが、サンプルコードを見ていただいておかしいところを指摘していただければ幸いです。 以下のようなコードになります。 int ShowBMP(HWND hWnd, HDC hdc) { HDC hmdc; HBITMAP hBitmap; BITMAP bmp; HINSTANCE hInst; int BMP_W, BMP_H; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hBitmap = LoadBitmap(hInst, "TOPBMP"); GetObject(hBitmap, sizeof(BITMAP), &bmp); BMP_W = (int)bmp.bmWidth; BMP_H = (int)bmp.bmHeight; hmdc = CreateCompatibleDC(hdc); SelectObject(hmdc, hBitmap); BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY); DeleteDC(hmdc); DeleteObject(hBitmap); return 1; }

  • SendMessageの使い方について

    http://kerochan.no-ip.com/vcsdk/letsprog/chap30.htm 上記のサンプルプログラムを実行すると、SendMessageが動いていないため、新規に作成したカーソルが表示されないと思われます。 SendMessageを使ってプログラムを完成させたいのですが、 どこを修正すれば良いのでしょうか? お分かりの方、どうぞよろしくお願いします。 ************************** 以下のように修正すれば、SendMessageを使わなくても正しく動くことは分かっています。 case WM_SETCURSOR:    hCrsrButton = LoadCursor((HINSTANCE)GetWindowLong(hButton,GWL_HINSTANCE),MAKEINTRESOURCE(IDC_BUTTON)); SetCursor(hCrsrButton); break;

  • WM_CLOSEで閉じれないウィンドウを閉じるには?

    以下にソースを張ります。 #include <stdio.h> #include <windows.h> BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lp) { static bool is_first = true; DWORD style = ::GetWindowLong(hwnd, GWL_STYLE); DWORD dwPID; if ( ::IsWindow(hwnd) && ::IsWindowVisible(hwnd) && (style&WS_CAPTION) && !(style&WS_POPUP) ) { char buf[65536]; ::GetWindowText(hwnd, buf, 65535); GetWindowThreadProcessId( hwnd, &dwPID ); if ( buf[0] != '\0' ) { if ( is_first ) is_first = false; else //printf("%c\n", 1); printf("%s%d\n", buf,hwnd); } } return TRUE; } int main (void){ ::EnumWindows(EnumWindowProc, 0); HWND hWnd; printf("プロセスIDを入力:\n"); scanf("%d",&hWnd); if( hWnd != NULL ){ printf( "終了します。-- pause --\n" ); getchar(); PostMessage( hWnd, WM_CLOSE, 0, 0 ); }else{ printf( "起動してないウインドウズです。\n" ); } return 0; } これですとたとえばメモ帳を編集していたときに WM_CLOSE メッセージを送ったときに「変更を保存しますか?」のようなダイアログが出る アプリがあります。これをダイアログが出ずに強制終了するには どうしたらよいでしょか?よろしくお願いします。

  • ツールバーにうまく文字が付けられません

    いつもお世話になっています。よろしくお願いします。 色々調べて、自分なりに改良したのですが、原因がつかめません。 アドバイス、ヒントをお願いします。 ツールバーの『windows標準のボタン』に、『文字を付ける』部分で躓いています。   //ツールバー作成関数 HWND MyCreateToolbar(HWND hWnd) { HINSTANCE hInst; HWND hTool; TBADDBITMAP tb; int stdid; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hTool = CreateToolbarEx( hWnd, WS_CHILD | WS_VISIBLE, ID_TOOLBAR, // コントロールID 0, hInst, NULL, tbb, 0, 0, 0, 0, 0, sizeof(TBBUTTON)); tb.hInst = HINST_COMMCTRL; tb.nID = IDB_STD_SMALL_COLOR; stdid = SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb); tbb[0].iBitmap += stdid; tbb[1].iBitmap += stdid; tbb[2].iBitmap += stdid; SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)&tbb[0]); tb.hInst = HINST_COMMCTRL; tb.nID = IDB_VIEW_SMALL_COLOR; stdid = SendMessage(hTool, TB_ADDBITMAP, 0, (LPARAM)&tb); tbb[3].iBitmap += stdid; SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)1, (LPARAM)&tbb[3]); } //ここでくくると、『ボタンに文字を付ける関数』が機能しない //『}』 を、『ボタンに文字を付ける関数』の最後につけると、文字が表示されるが、エラーが出る。 //エラー E2108 c:\ツールバー\toolbar\toolbar.cpp 201: typedef 'HWND' の使い方が間違っている(関数 MyCreateToolbar(HWND__ *) ) エラー E2379 c:\ツールバー\toolbar\toolbar.cpp 201: ステートメントにセミコロン(;)がない(関数 MyCreateToolbar(HWND__ *) ) *** 2 errors in Compile *** /ボタンに文字を付ける関数 HWND MyCreateToolbar(HWND hWnd); //;セミコロンをつけないと //HWNDの使い方が間違っている ステートメントにセミコロンが無い の エラー { HINSTANCE hInst; HWND hTool; TCHAR szBuf[16]; int iNEW; int iOPEN; int iPARENT; int iDELETE; TBADDBITMAP tbab; InitCommonControls(); hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); hTool = CreateWindow(TOOLBARCLASSNAME, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hWnd, (HMENU)ID_TOOLBAR, hInst, NULL); SendMessage(hTool, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); tbab.hInst = HINST_COMMCTRL; //既成はCOMMCTRL 自作ビットマップはNULL tbab.nID = IDB_STD_SMALL_COLOR; ID_TOOLBAR; SendMessage(hTool, TB_ADDBITMAP, (WPARAM)0, (LPARAM)&tbab); LoadString (hInst, IDS_NEW, szBuf, (TCHAR)sizeof(szBuf)); iNEW = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbb[0].iString = iNEW; LoadString (hInst, IDS_OPEN, szBuf, (TCHAR)sizeof(szBuf)); iOPEN = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbb[1].iString = iOPEN; LoadString (hInst, IDS_DELETE, szBuf, (TCHAR)sizeof(szBuf)); iDELETE = SendMessage(hTool, TB_ADDSTRING,0, (LPARAM)szBuf); tbb[2].iString = iDELETE; LoadString (hInst, IDS_PARENT, szBuf, (TCHAR)sizeof(szBuf)); iDELETE = SendMessage(hTool, TB_ADDSTRING, 0, (LPARAM)szBuf); tbb[3].iString = iPARENT; SendMessage(hTool, TB_ADDBUTTONS, (WPARAM)3, (LPARAM)(LPTBBUTTON)&tbb[0]); return hTool; } } ツールバー作成関数を 『}』で閉じると 文字を付ける関数が機能せず、標準のボタンが4つ表示されます。 『}』 を『文字を付けるをつける関数』の最後に付けると文字が表示されるが、『ツールバー作成関数』の所で閉じていないので、エラーが出ます。 『}』 を『文字を付けるをつける関数』の最後に付けると ボタン二つ分の大きさの『文字だけのボタンが最初に表示されたボタン4つを隠して3種類だけ表示されます。(新規作成、開く、削除) このとき、新規作成などの文字の上の部分をクリックすると、隠れていたボタンが出てきます。 その出てきたボタンもクリックできます。文字をクリックすると、ボタンは、隠れてしまいます。 VC++で『文字を付けるをつける関数』は、エラー、警告が出て作れません。

  • ビットマップ画像表示

    いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を 表示させようとプログラムを組んだのですが、 子ウィンドウを出してもビットマップ画像が表示されません。 以下のようなプログラムを追加しました。 --------------------------------- ///リソーススクリプト/////////////////////////////////  IDB_BITMAP1  BITMAP DISCARDABLE  "HELP.bmp" ///ヘッダースクリプト/////////////////////////////////  #define IDB_BITMAP1   3000 ///ソーススクリプト/////////////////////////////////// void ShowMyBMP(HWND hWnd, HDC hdc){   HDC hmdc;   HBITMAP hBitmap;   BITMAP bmp;   HINSTANCE hInst;   int BMP_W, BMP_H;   hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);   hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));  //インスタンスハンドル取得   GetObject(hBitmap, sizeof(BITMAP), &bmp);  //ビットマップの情報を得る   BMP_W = (int)bmp.bmWidth;  //画像の幅   BMP_H = (int)bmp.bmHeight;  //画像の高さ   hmdc = CreateCompatibleDC(hdc);  //メモリデバイスコンテキストハンドルを取得   SelectObject(hmdc, hBitmap);   BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY);   StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY);   DeleteDC(hmdc); //デバイスコンテキストハンドルを開放   DeleteObject(hBitmap);   return; } --------------------------------- ShowMyBMP関数は子ウィンドウを表示するときに実行されます。 全て載せられないので追加した部分のみプログラムを載せましたが、 この部分だけでも、プログラムの間違い等はありませんでしょうか。 ご教授お願いいたします。

  • ダイアログボックスで指定したサイズどおり表示されない

    ダイアログボックスで指定したサイズがメイン上では約2倍の大きさになって表示されてしまい、困っています。 メニューリソースは以下のとおりです。 MYDLG DIALOG DISCARDABLE 25, 50, 100, 150 STYLE WS_VISIBLE | WS_CHILD | DS_CONTROL CAPTION "Dialog" FONT 9, "MS Pゴシック" BEGIN END WndProc内にダイアログを貼り付けています。 if(hDlgWnd) break; hDlgWnd = CreateDialog((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),"MYDLG",hWnd,DialogProc); それが実際にウィンドウを開くとダイアログがだいたいですが(50,115,200,340)のように表示されてしまいます。 VC++ Ver.6.0です。コンパイラ等の問題でしょうか。 ご存知の方、宜しくお願いします。