EXEからDLLへの移植について

このQ&Aのポイント
  • EXEからDLLへの移植方法や違いについて教えてください
  • EXEをDLLに移植する際に注意すべきポイントはありますか
  • EXEからDLLへの移植に関する経験のある方、アドバイスをお願いします
回答を見る
  • ベストアンサー

EXEからDLLへ移植

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

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

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

ダイアログのリソースがDLLにないのに、DLLのインスタンスを渡してもリソースが見つかるはずがないので、リソースのある方のインスタンスハンドルを渡さないとだめですよね。 リソースはどちらにありますか。 リソースがどちらにもないのに、いずれかのインスタンスを渡してもリソースが見つかるはずがないので、リソースをいずれかに追加しないとだめですよね。 リソースは追加されていますか。 リソースのIDが異なっているのに、そのIDで探しに言っても正しいリソースが見つかるはずがないので、正しいリソースハンドルを使わないとだめですよね。 追加しているリソースのIDは、ヘッダのものと一致していますか。 (EXEとDLLは別プロジェクトになりますが、正しく一致していますか)

R360
質問者

補足

>追加しているリソースのIDは、ヘッダのものと一致していますか。 一致しているのですが、表示されません。よろしくお願い致します。

その他の回答 (2)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

hInstance に渡されているハンドラは「誰の」ハンドラですか? ExeからDLLをロードした場合、ExeのハンドルとDLLのハンドルは違うのですが、どちらを渡していますか。 そして、対象ダイアログのリソースを持っているのは、 ExeとDLLのどちらですか。両者は一致していますか。 # あっていると思っても、ためしに別のハンドルを渡してみたら表示されたりしませんか。

R360
質問者

補足

DLLのハンドルです。 両者が一致しているかはわかりません。(すみません)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

以前の質問に対する回答でほぼ解決できそうに見えますが、#3の方のご指摘などは確認されてますか? > 実行形式で組まれたプログラム(ソース)を -- snip -- > よろしくお願い致します。 リソースなどを参照する際のインスタンスが異なる、 スレッドが違う、など。 たぶん、具体的なコードを提示してもらった方が早いです。

R360
質問者

補足

具体的にコードを出そうと思います。 extern "C" int WINAPI IOPI_Init(HINSTANCE hInstance, HWND hRootWnd, HWND hParentWnd) { … hAppModule=(HMODULE)hInstance; …  HWND hDlgWnd = ::CreateDialog(   hAppModule,   MAKEINTRESOURCE(IDD_DIALOG1),   hWnd,   (DLGPROC)MyDlgProc); … 以上、このようなところです。よろしくお願い致します。

関連するQ&A

  • exeファイルはどのdllを参照すべきか、知っているのでしょうか。

    dllとは、プログラムが実行時に参照するものですよね。 よく使われる機能があらかじめ作られているものですよね。 私はC言語しか知らないので、C言語でプログラミングすることで話を進めさせてください。 (とは言っても、ごく初歩的なプログラムが組めるだけの素人です。) OSはWindowsということにします。 C言語は、関数の集まりでソースが書かれています。 dllも、中身に関数の実体が記述されている、そういうイメージでしょうか。 私がもっと勉強して、複雑なプログラムを組んだりすると、 「あ、これはdllに実体がある機能だから、いちいち実装を書かなくてもいいんだな」 と考えて、ソースファイル( ~.c )の中でその関数を使うだろうと思います。 私がよくわからないのはここからです。 dllにある関数をソースで使って、無事コンパイルして、さあリンクしてexeを作りましょう、 というときに、リンカ(リンクを行うプログラム)は、 「そんな関数、実体がないぞ」 って文句を言ってこないのでしょうか。 いや、リンカは、dllに実体がある関数だということを知っているはず。 でもそれって、いちいち 「この関数はどこどこにある ○○.dll というdllに書いてあります」 というふうに、リンカに教えてあげなくてはいけないのでしょうか。 (それってまさか、ソースに書くわけじゃないですよね? ) それから、 exeファイルっていうのは「この機能はdllに行わせる機能だ」ということを知っているのでしょうか。 dllに行わせる機能だということを知っているとしても、 どのディレクトリにある なんと言う名のdllに その機能が書かれていることまで知っているのでしょうか。 (でもそこまで知っていたら逆に、ディレクトリ構成の違うマシンでは実行できなくなってしまうし。) そういうような原理的なことを教えてください。

  • ATL.DLLについて

    OSはWindows98です。ウイルスにも感染していません。 あるアプリケーションexeを実行してから、 『Can not run Unicode version of ATL.DLL on Windows 95. Please install the correct version.』 のメッセージが頻繁に出るようになりました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=243145 の回答3に沿ってANSI バージョンの ATLをダウンロードして「出てきたatl.exe をダブルクリック」したのですが、 『Error registering the OCX c:\windows\SYSTEM\atl.dll』 というエラーメッセージが出て上手くいきません。 どうしたらよいでしょうか? 困っています。助けてください。

  • WinRARでUNRAR32.DLLはいる?

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=2190094にて A-No.3の方がDLL二つ入ってますか と言ってますが必要なんですか?

  • excelでdeclareしたdllからのCreateDialog

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

  • EXEを起動するとDLLが見つからないエラー

    VC超初心者です。 あるベンダ提供のdllとヘッダファイル、libファイルすべてそろっています。 DLLを使用するにあたって、宣言を記述せずにlibファイルをインポートしました。 どうにかこうにかコーディングをしました。VisualC++でソースを開いて実行(F5)すると正常に動きました。 しかし、いざEXEファイルを作ってそれを実行すると「DLLが見つかりません」というエラーが出ます。 これはどうすれば回避できますか?

  • xmine.exeについて

    私はavastをパソコンに入れているのですが、最近になって  安全ではないプログラムが実行されるとのダイアログが起動時に表示されるようになってしまいました 場所はC:\Documents and Settings\User\Application Data\folder\xmine.exe folderの内容物はchp.exe,diablo120328.cl,diakgcn120427.cl, libcurl-4.dll,libcurl.dll,libeay32.dll,libidn-11.dll,libpdcurses.dll,libssl32.dll, libusb-1.0.dll,pdcurses.dll,poclbm120327.cl,pthreadGC2.dll,upatess.bat,xmine.exe です 削除してもいつのまにか元に戻っています これはウイルスでしょうか?どうしたら削除できるでしょうか?

  • unzip32.dllを使ったプログラム

    unzip32.dllを使ったプログラムでは、解凍のたびに実行結果のダイアログが表示されてOKを押さなければならないのでしょうか。何か設定があるのでしょうか。

  • services.exe

    タスクマネージャでservices.exeが動いていたので、 マルウェアかと思い、質問させてもらいました。 OSはXPです。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=208983 こちらの質問も確認したのですが、 Cドライブを検索した結果、 C:\WINDOWS\system32 C:\WINDOWS\ServicePackFiles\i386 C:\WINDOWS\$NtServicePackUninstall$ という3つのパスのservices.exeがありました。 system32の以外の2つのservices.exeはマルウェアなのでしょうか?

  • EXE1→DLL→EXE2数値を受け渡す方法

    C++プログラムの初級者です。 EXE1の数値をDLLの関数Func1に渡し、そこで計算した結果を関数Func2でEXE2に送るプログラムを作成しています。 下記のようなDLLのコードを作成したのですが、うまく数値を受け渡すことが出来ません。 調べてみると、EXE1⇔DLLとEXE2⇔DLLとは、アドレス空間が別なので、DLLのStatic変数を共有できないようです。 EXE1⇔DLL と EXE2⇔DLL の1対1では数値受け渡しは、正常に動作しています。 具体的に、DLLにどのようなコードを書けば、数値を受け渡すことができるのでしょうか? ご指導よろしくお願いします。 VC++2010ExpressEdition で作成しています。 <DLLのソースコード> ---------------------- #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <iostream> static double aa, bb; __declspec(dllexport) double __stdcall Func1(double a1, double b1) { aa = a1*2; return (double)(aa); } __declspec(dllexport) double __stdcall Func2(double a2, double b2) { return (double)(aa); } BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) { //---- switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } //---- return(TRUE); }

  • 「Updateicon.exe DLL初期化の失敗」とは何のことでしょうか?

    PCの終了時にダイアログがでて「Updateicon.exe DLL初期化の失敗・・・ウインドウズステーションがシャットダウン中であるためアプリケーションが初期化に失敗しました」 と表示されます。 この表示は、何のトラブルでしょうか。また、どうしたら表示されなくなりますか。 よろしくお願いします。