• ベストアンサー

VC2005のDLL明示的リンク

VC2005のDLL明示的リンクについて質問です。 <前提> DLLファイルに宣言されている関数(Export関数)が、 4ファンクションあるとします。そのDLLファイルを、 Dependency Walkerで確認すると、以下のようになります。 --------------------------- 関数名 エントリポイント --------------------------- add1 0x00001010 sub2 0x00001030 mul3 0x00001060 div4 0x00001090 <質問> このDLLファイルがexeファイルからLoadLibraryで 読み込まれた場合、プロセスメモリ上には、 上記のエントリポイントの順番で必ず配置されるのでしょうか? 補足ですが、この時、プロセスメモリ上にロードされる位置 は、気にしていません(ベースアドレスは変わることがあるのは認識しています)。 要は、エントリポイントの順番が変わったりしないかを、知りたいです。 <プロセスメモリ上に、エントリポイント順に配置されたイメージ> 0000_0000h --------------------------- (略) --------------------------- add1 --------------------------- sub2 --------------------------- mul3 --------------------------- div4 --------------------------- (略) --------------------------- FFFF_FFFFh <プロセスメモリ上に、エントリポイント順に配置されなかったイメージ> 0000_0000h --------------------------- (略) --------------------------- sub2 --------------------------- add1 --------------------------- div4 --------------------------- mul3 --------------------------- (略) --------------------------- FFFF_FFFFh それとも、こんな感じで、OS依存(実行環境依存)で、色々な配置に なるのでしょうか?

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

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8516/19360)
回答No.2

確実なのは以下の1点だけです。 ・DLLのファイルイメージがそのままメモリイメージとなる(OSがバイナリファイルを一気にメモリにロードするため) なのでDependency Walkerが「ファイル上での位置を表示している」なら「メモリ上でも同じ順番」の筈です。

darkness22
質問者

お礼

ご回答ありがとうございます! > OSがバイナリファイルを一気にメモリにロードするため なるほど、そうなると変わらないはずですね。 ありがとうございました。

その他の回答 (1)

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

そのままのイメージだと思いますけどね。 違うのは、セグメントごとに割り当てるアドレスが違うことぐらいかなと。 だってわざわざ関数の並び順を変える意味が分からない、、(-_-;)

darkness22
質問者

補足

参考意見ありがとうございます。 私もそう思うのですが、確証できる文献がなくて^^; もう少し探してみます。

関連するQ&A

  • VCで作ったDLL【否 .Net】 配列

    VCでDLLを作り、VBから呼び出しています。 今やりたいのは、Cで言えば void Calc(int a, int b, int x[]) {  x[0] = a + b;  x[1] = a - b;  x[2] = a * b; } int main(int argc, char *argv[]) {  int n[3];  Calc(8,1,n);  printf("%d %d %d\n",n[0],n[1],n[2]);  return 0; } と、いうことです。 関数Calcを__stdcallやdefファイルを使って呼び出せるようにし、VBから呼ぶのですが、うまくいきません(~~メモリが"written"になることは~~)。 VBでは Declare Sub Calc Lib "SimpleDll.dll" (ByVal a As Long, ByVal b As Long, ByRef x() As Long) …略… Dim x(3) As Long Call Calc(6, 4, x) …略… としています。 どうかお力添えを。

  • C++ のDLLがdelphiで読めない

    VisualStudio2010C++で作ったDLLをdelphiで利用したいのですが、「エントリポイントが 見つかりません」といわれてしまいます。チュートリアルのサンプルそのままで試して見ましたが、VS2010 付属のdumpbin .exe でdllの中身を見るとエントリポイントが @ILT+345?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z)みたいな、元の関数名はどうした? と思えるような名前です。 defファイルを使って見ましたが、今度は 1 0 0001115E Add = @ILT+345(?Add@MyMathFuncs@MathFuncs@@QAGNNN@Z) みたいな表示でやはりdelphiから読めません。__stdcall にはしています。 VC++で読み込めばちゃんと読めるのである意味正しく作られているのだと思いますが、他のOpenNI , OpenGL などのdllをdumpbin /exports で覗くと、整然と関数名が並び、 これなら読めるだろうと思えますし、実際にdelphiでも使えます。 他の言語ですっきり関数名で呼び出せる(普通の)DLLを作るにはどうすれば良いのでしょうか。 VisualStudioで作ったDLLは呼ぶ側があの記号のような名前で呼べということなのでしょうか?

  • VC++でDLL、エントリポイントが出来ない?

    VisualStudio2010 VC++でDLLを作成し既存のDelphiXE2アプリで利用したいのですが MSのサンプルソースそのままでDLLを作成しても、__stdcall;しても、Delphiの読み込み時に 「エントリポイントが見つかりません」と言われます。 http://msdn.microsoft.com/ja-jp/library/ms235636.aspx ソースはMSのチュートリアルそのままです。 ためしに VS2010のツール dumpbin.exe /exports ????.dll と中身を覗くと 1 0 ooo11104 ?Add@MyMathFuncs@MathFuncs@@SGNNN@Z 2 1 ,,,,,,,,,,,,,, のような表示とSummary 以下しか表示されずスタティックライブラリにしても中身は同じです。 それでは、と他のDLLをいくつか覗いてみましたが、大概のDLLやLIBファイルを覗くと すっきりしたきれいな関数名の一覧がdumpbin /exports で表示されます。 では、DLLになっていないのかというと、作ったDLLを同じVC++でチュートリアル通りに 呼び出すと何の問題もなく使えますので、多分正常なのでしょう。 しかし、どうして エントリポイントの一覧が見える形にならないのか分かりません。多言語で利用するには 必要かと思います。 VC++で作成したDLLやLibが他の環境で使えないとは考えられないので、なにか、常識的な 部分を知らないのだと思いますが、どなたかよろしくお願いします。

  • VCで作成したDLLの使用

    VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000

  • MSVCP80.dll 

    X-APPLICATION.exe-エントリーポイントが見つかりません プロシージャ エントリポイント ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2IBが ダイナミック リンク ライブラリ MSVCP80.dll から見つかりませんでした このエラーはどうしたら解決できるのでしょうか?ソフトが起動できません。 MSVCP80.dllというのをDLして、system32にいれたのですが、解決しませんでした。 何か方法はありますlか? WINDOWS7です。

  • DLLが正しく呼び出せません (ToT)

    こんにちは。よろしくお願いします。 環境は、WindowsXP Access2000/VBA にてプログラミングをしています。 現在、表題の「DLLが正しく呼び出せません」エラーに泣かされています。。。。 どなたかもし心当たりなどありましたらぜひアドバイスを下さい。 VBAにてシステムを作成していますが、その中で、普通に自分で書いた関数を 普通に?呼び出しているだけなのですが、表題のエラーが頻発してしまい困っています。 別に、外部DLLをDeclareしてそれを呼び出した時に出ている、という事ではないです。 普通に自分で書いた関数を呼び出すだけなんですが、ある関数を呼び出すと、 返ってくる時にこのエラーが発生するものがあります。(SubでもFunctionでも) 引数の型や戻り値の型は、呼び出し側と整合が取れています。(確実に一致しています) まったく原因がわからないので、例えばエラーの出た関数がSubの場合は 一応 Call をつけて呼び出してみたりするとその場はエラーがなくなったりして でも、またその関数の中を編集したりすると、いつのまにかまた その関数を呼び出した時に表題のエラーがでたりします。 もちろんコンパイルエラーはありませんし、SetしてNothingを忘れてメモリを壊している という事などもないつもりです。 (エラーのでる関数ではそもそもSetなどを使っていませんし) DLLの関数を呼び出すのではなく普通に標準モジュールなどに書いた自前の関数の呼び出しで 表題のエラーがでる原因として、なにか考えられる事はあるのでしょうか。 実際のソースを載せれないので申し訳ないですが、一般的な情報として 「DLLが正しく呼び出せません」エラーの原因となる事をどのような事でもけっこうですので 教えていただければ、と思います。 どうかよろしくお願いいたします。

  • 一太郎が開けない MSVCRT40.dll

    一太郎が突然開けなくなります。 日によっていろいろなのですが、 今日は2週間ぶりに開けないのです。 次のような警告の窓が表示されます。 ********************************************** TARO13.EXE.エントリポイントが みつかりません プロシージャエントリポイント ?terminate@@YAXXZがダイナミックリンクライブラリ MSVCRT40.dllから見つかりませんでした。 *********************************************** 心当たりとしては、 最初に開けなくなった頃、 ファイルの処理をしていて、 使っていないファイルを削除したり、移動したりしたことです。 にしても、開ける日もあれば、開けない日もあるというのがおかしいです。 一太郎を再インストールするのがよいでしょうか? (再起動をかければ開ける事もあります) MSVCRT40.dllはどうやら音楽関連のファイルのようなのですが、再インストールでは解消されないのでしょうか??? 教えてください。

  • DLLはアドレスを共有する?

     CでWindowsプログラミングの勉強をしています.そこでDLLについての質問なのですが,ある本で「DLLは複数のプログラムが共有し,ひとつのDLLはひとつしかメモリ上に配置されない」という文章を読みました.プログラムはDLLの配置されてあるアドレスを元に,DLL内の関数を実行するのだと考えれば納得はいきましたが,よく考えたらおかしいと思いました.  それは「変数,関数」の取り扱いはどうなるのか,ということです.C言語で物理メモリアドレスを見る方法がわからないので何とも言えませんが,試しに,DLL内に次のような関数MyFunctionを用意し,このDLLを取り込むプログラムを同時に2つ走らせ,MyFunctionを何度も呼んでDll1_Variableの値を増加させていきました. LIBSPEC int MyFunction(LPCWSTR str) { static int Dll1_Variable=0; Dll1_Variable++; _tprintf(_T("%d\n"),Dll1_Variable); return 0; }  もしDLLが共有されているのならば,Dll1_Variableの値は2つのプログラムから同時に更新されると思うのですが,実際には2つのプログラム上でまったく独立(つまり各プログラムごとに1,2,3,...というように)増加していきました.こうなるとDLLって本当に共有されているのかという,不信感が出てきてしまいます.  なんだか重大な勘違いをしている気がしてなりませんが,上記のプログラムがなぜ独立に変数が増加していくのか,「DLLが共有される」というのは実際にはどういう仕組みになっているのか,ご存知の方がいらっしゃったらご教授ください.わかりにくい質問ですみません.よろしくお願いします.

  • Shemeで掛け算の関数

    Shemeで掛け算の関数 関数muliを定義しなさい。ただしzero,inc,dec,add,mulはすでに定義されて、 muliはmulの中から(mulli x y (zero))と呼ばれる。 なんとなくわかるかもしれませんが、 (define (dec n) (cdr n)) (define (zero) (quote())) (define (add x y) (if (null? y) x (add (inc x) (dec y)))) となっています。 この問題で (define muli (lambda (x y n) ((if (null? y) n (muli x (dec y) (add n x)))))) と考えたのですがうまくいきません。 ご教授よろしくお願いします。

  • VBで使用できるDLL(SSL通信)をVC++で作成する。

    VBで使用できるDLLをVC++で作成しました。 内容は、SSL転送をWindowsで行うためのDLLです。 DLLではなくexeで作成したときはDOS窓からうまく動いたのですが、 DLLで作成をして、VBから呼んだときにエラーメッセージがでてプログラムは実行されません。 エラーメッセージは、 実行時エラー'53': ファイルが見つかりません:dll-file-name です。 エラーにはいろいろな要素があると思うのですが、 このエラーが出るか出ないかは、関数の中のSSL通信のプログラムを書くと このエラーがでます。 例>SSLeay_add_ssl_algorithms(); SSL通信の記述がなければ正常に実行されるので、この部分だけだと思うの ですが、特別な設定、記述があれば教えてください。 よろしくお願いします。

専門家に質問してみよう