• ベストアンサー

CreateDialogについて

CreateDialogをもちいて、表示するダイアログの設定をしています。CreateDialogは、関数が成功するとウィンドウハンドルが返りますが失敗して、NULLが返ってきてしまいます。この失敗について、どのようなことが起こると失敗するか、失敗する理由について教えてください。 実行形式ファイルでは正常でしたが、DLLに移植しようとしてうまくいきません(ダイアログが表示されません)。 コンパイル、リンク時にはこれに関わるメッセージはありませんでしたので、原因究明に困っています。 よろしくお願い致します。

  • R360
  • お礼率69% (365/524)

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

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

「ERROR_RESOURCE_NAME_NOT_FOUND」は「リソース名が見つかりません」という意味です。その意味するところは、指定されたリソース名が見つからなかったということです。 すなわち、CreateDialogの第2引数で指定したリソース名に対応するリソースを、CreateFileの第1引数で指定したモジュールからみつけることができなかったということです。 どんな引数を与えているのか、与えた引数は正しいのか、与えた引数に対応するリソースは本当に存在するのか、よく確認してください。

その他の回答 (2)

  • macchun
  • ベストアンサー率50% (3/6)
回答No.3

おそらく * リソースは EXE から DLL に移植した * CreateDialog() の第一引数に NULL を設定している ではないでしょうか? もしそうだとしたら、CreateDialog() の第一引数を NULL ではなく DLL のインスタンスに変更する必要があります。DLL のインスタンスは DllMain の第一引数をグローバル変数にコピーしたものを使用します。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

いろいろな原因が考えられます。 NULLが返ったとき、エラーの詳細はGetLastError関数で取得できますが、その値ではどんなエラーが発生していることになっていますか? 補足願います。(ERROR_RESOURCE_xxxx_NOT_FOUNDあたりかなーと想像しますが。)

R360
質問者

お礼

エラーコードを確認しましたが、「ERROR_RESOURCE_NAME_NOT_FOUND」でした。ただ、どのリソース(CreateDialogの送り値)が良くないのかが解りません。いずれのリソース(Bitmap、DIALOG)も作成されていないということはありません(移植する際、IDがおかしくなった?)。そのあたりを解析する方法はありませんでしょうか?

R360
質問者

補足

ありがとうございます。 今日中に確認してみますので、少々お時間をください。

関連するQ&A

  • excelでdeclareしたdllからのCreateDialog

    こんばんは。教えて! excelからC++で作成しているdllを呼び出し、 dll内でダイアログを作成し表示したいと思っています。 問題は、CreateDialogで失敗(以下のコードでhDlgが0になる)することです。 hDlg = CreateDialog( NULL, MAKEINTRESOURCE(IDD_DIALOG) , NULL, (DLGPROC)DlgProc ); 第一引数と第三引数に何かいれないといけない気がしていますが、いろいろ試行錯誤してもうまくいきません。 第一引数と第三引数はどこから引っ張ってくればよいでしょうか?? お願いいたします。

  • EXEからDLLへ移植

    以前、下のような質問をさせていただいたものです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1748227 EXE(実行形式)で既にあるプログラムをDLLとして移植したいのですが、うまくいきません。うまくいかない事象は上のページで質問しましてまだ解決しておりません。(ウインドウ内にCreateDialogを用いてダイアログを表示させようとしても表示されない) 実行形式で組まれたプログラム(ソース)をDLLに移植する時の一般的な方法、注意すべきところ、そのままソースを移植してもダメな理由(EXEとDLLの違い)などありましたら教えてください。同じようなことをした経験のある方など、よろしくお願い致します。

  • VB6で作成したDLLをVC6で使用する方法

    VB6で作成したDLLをVC6で使用できなくて困っています。 以下にトライしたことを示します。 (1) VB6でTRUEを返すだけの関数を入れたActiveX DLLを作成 (2) VC6のLoadLibraryに成功(戻り値がNULL以外) (3) VC6のGetProcAddressに失敗(戻り値がNULL) (4) VC.NET付属のDumpbinユーティリティでは(1)で作成した関数が表示されない。 何が悪いのでしょうか。 宜しくお願いします。

  • DLLの明示的な読み込みの方法

    開発環境:WindowsXP sp2 + VisualStudio2005 MSDNやその他のWebページで、DLLの明示的なロードについて勉強しています。 試しに以下のようなコードを書いてみたのですが、コンパイルは通りますが、実行時にDLLが読み込まれているのにもかかわらず、関数のアドレスが取得できません。 ---DLLのコード--- #include <iostream> using namespace std; __declspec(dllexport) void printMessage() { cout<<"printMessage関数が呼ばれた"<<endl; } ---終わり--- コンパイルしたDLLのみをDLLを使用した実行形式がコンパイル後に収納されるフォルダに移動して、以下のコードを書いてコンパイルしました。 ---EXEのコード--- #include <windows.h> #include <iostream> typedef void(*TFUNC)(); int main(void) { HINSTANCE hInstDLL; TFUNC DllFunction; //DLLの読み込み hInstDLL=LoadLibrary(L"dll.dll"); if(hInstDLL==NULL) { std::cout<<"ERROR"<<std::endl; return 0; } //printMessage関数のアドレスを取得 DllFunction=(TFUNC)GetProcAddress(hInstDLL,"printMessage"); //この辺りがおかしいかも知れない //関数の使用 if(DllFunction==NULL) { std::cout<<"ERROR"<<std::endl; FreeLibrary(hInstDLL); return 0; } DllFunction(); //DLLの解放 if(!FreeLibrary(hInstDLL)) return 0; return 0; } ---終わり--- DLLは見つかる物の、どうも上手くいかないようです......原因は何なのでしょうか。

  • WinAPIでのファイル操作について教えて下さい。

    現在参考書やwebサイトと参考にWindowsプログラミングを学んでいます。 下記のサイトにあるファイル作成のソースをコンパイルして実行したのですが http://wisdom.sakura.ne.jp/system/winapi/win32/win111.html #include <windows.h> int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { HANDLE hFile; hFile = CreateFile( lpCmdLine , GENERIC_READ , 0 , NULL , CREATE_NEW , FILE_ATTRIBUTE_NORMAL , NULL ); if (hFile == INVALID_HANDLE_VALUE) { MessageBox( NULL , TEXT("ファイルを作成できません") , TEXT("エラー") , MB_OK ); return 1; } CloseHandle(hFile); return 0; } コンパイルは成功するのですが実行すると必ずエラーになります。 他のソースも同様にファイル操作に失敗した場合の表示が行われます。 自分が持っている参考書にはファイル操作についてあまり詳しく書かれていないので他のソースも試せません。 どなたか教えて下さいよろしくお願いします。

  • エディタ コマンド トラブル 失敗 エラー パソコン テキスト クリック URL リンク

    ある時から、テキストエディタに記載しているURLをクリックすると“このコマンドの実行に失敗しました”とダイアログボックスが表示されリンクできなくなりました。URLをコピーしてアドレス欄に入力すると問題なくリンク先に移動できます。どうしたら、正常にリンクできるようになるでしょうか?教えてください。

  • AfxLoadLibrary関数で、DLLのハンドルが取得できない

    はじめまして。 タイトルの通りですが、AfxLoadLibraryを使用して、DLLのハンドルを取得しようとしています。(取得したハンドルでGetProcAddress関数を使用する為) ここで、AfxLoadLibraryの戻り値となる、ハンドルがNULL(0x0000)となってしまい、GetProcAddressによる関数ポインタの設定が行えない状況となっています。 FormatMessage関数とGetLastErrorを使用し、原因を調べたところ、「指定されたモジュールが見つかりません」というメッセージとなりました。 AfxLoadLibraryで指定しているDLLについては、Exeファイルと同じフォルダ内に存在し、かつ、名前についても間違っていません。 試しに、別DLLを、上記NGとなるDLLと同様の名前で作成してみたところ、ハンドルの取得に成功したので、EXE側のコーディングミスという所は考えづらいところです。 お手数ですが、他の原因に心あたりがありましたらご教唆願います。 <コーディング(一部抜粋)> ---------------------------------------------------------------- HINSTANCE m_handle_Aaa; typedef WORD (WINAPI *LPOpenAaa)(); LPOpenAaa lpOpenAaa; BOOL DllLoad(void) { // Load Dll m_handle_Aaa = AfxLoadLibrary("AaaDLL.dll"); if(m_handle_Aaa < (HINSTANCE)HINSTANCE_ERROR) { PutLastError(); // Error Message return FALSE; } // Get Function Pointer lpOpenAaa = (LPOpenAaa)GetProcAddress( m_handle_Aaa, "OpenAaa"); if(lpOpenAaa == NULL) return FALSE; ・ ・ ・ ----------------------------------------------------------------

  • コンパイルはできるが、リンクエラーがでます。

    WritePwrScheme()を使ったプロセスを作ろうとしています。コンパイルは問題ないのですがリンク時にその関数が未解決のシンボルとして表示されます。これってpowrprof.libが悪いのでしょうか?それともpowrprof.dll? そうだとしたらどこで入手できるのでしょうか? お分かりの方、回答をお待ちしております。

  • テキストエディタに記載しているURLをクリックしても飛びません

    ある時から、テキストエディタに記載しているURLをクリックすると“このコマンドの実行に失敗しました”とダイアログボックスが表示されリンクできなくなりました。URLをコピーしてアドレス欄に入力すると問題なくリンク先に移動できます。どうしたら、正常にリンクできるようになるでしょうか?教えてください。 因みに使用しているエディタはEmEditor(フリー版)ですが、どのエディタで開いても同じです。

  • dllのロードアドレスについて

    いつもお世話になっております。 現在、アプリケーションのデバッグを行っていて、dllのロードについて不明な点があります。 C++で作成したアプリケーションを起動すると、main関数が呼ばれる前に「アプリケーションが正しく初期化されませんでした(0xc0000005)。」というダイアログボックスが表示され、エラー終了してしまうという現象が発生しています。 但し、このアプリケーションは共通のソースを使用して、条件コンパイルによってGUIの描画部分等が違うといった、複数のアプリを作成することができます。そして、このうちの1つのアプリのみ上記のようなエラーが発生してしまいます。 デバッガによって正常に動くアプリとエラーになるアプリとで、アプリ実行時にロードされるdllの基底アドレスに違いがあるということが分かりました。 ※エラーになる方は、明らかに不正なアドレスにロードされているdllがあります。大抵のdllは0x60000000以降のアドレスですが、0x00300000代にロードされるdllがあります。 そこで、アプリケーションが実行時にロードするdllの基底アドレスが不正になってしまう理由がわかればと思い質問いたしました。 (コンパイル時のリンクオプション等が間違ってしまっているのかと思っています。。。) そもそも、dllがロードされる基底アドレスがどのように決まるものなのかも分からないのですが、どなたか御教授して頂けないでしょうか? 以上、よろしくお願いします。