ページ 11

dllの呼び出し

Posted: 2014年5月04日(日) 22:08
by dic
まだやってないんですけど、できたとしても偶然だといけないので質問させてください。

いま、Visual C++ 6.0 で dll を作って
Visual C++ 2010 Express でこのdllを呼び出したときに
32ビット環境のものを64ビット環境で呼び出したら不具合がでるのでしょうか?

Re: dllの呼び出し

Posted: 2014年5月04日(日) 23:18
by YuO
  • 32bit DLLを32bit Processから呼び出すことはできます。
  • 32bit DLLを64bit Processから呼び出すことはできません。
  • 64bit DLLを32bit Processから呼び出すことはできません。
  • 64bit DLLを64bit Processから呼び出すことはできます。
ProcessのプラットフォームとDLLの対象プラットフォームの関係は,上記のようになります。
その.exe/.dllがどのようなコンパイラで作られたかは関係しません。

Re: dllの呼び出し

Posted: 2014年5月05日(月) 01:03
by dic
>>YuOさん

丁寧な説明ありがとうございます。

Visual C++ 2010 Express で dll が作れないというような情報を目にした気がしたことがあるのですが、
調べたところ、そんなことはなく Visual C++ 2010 Express でも dll は作れるようでした。

ひとまず、任意のビットのdll と任意のビットのプロセスの関係は解決しました。



しかし、さらに疑問が

今のOSはWindows7 で 64ビットです。
しかし、Visual C++ 2010 Express では Win32 プロジェクトで作成しているので、
この状態で実行ファイルを作ると、32ビットの実行ファイルができて、64ビットOS上で実行されるということでしょうか?
また、dllも32ビットのものになり、32ビットの実行ファイルが32ビットのdllを
読み込んで、64ビットのOS上で動作することになるのでしょうか?



このような即解決してしまっても、別トピックでスレを立てた方がいいのでしょうか?

Re: dllの呼び出し

Posted: 2014年5月05日(月) 05:33
by YuO
64bit Windows上で32bitのアプリケーションは,WOW64という32bit Windows環境を模した環境で32bitアプリケーションとして動作します。
このWOW64の存在は,通常気にする必要のないものです。
なので,64bit Windowsの上では,64bitアプリケーションも32bitアプリケーションも区別無く,そのプラットフォームで実行しているかのように実行できます。
オフトピック
例外的に,.NET Frameworkのアプリケーションで対象がAnyCPUの場合のみ,32bit Windowsでは32bitアプリケーションとして,64bit Windowsでは64bitアプリケーションとして実行されます。
また,AnyCPUの.NETクラスライブラリは,32bitプロセスに読み込まれれば32bitのクラスライブラリとして,64bitのプロセスに読み込まれれば64bitのクラスライブラリとして振る舞います。
これが,VS2010でC#などのアプリケーションのデフォルトが32bitになったにも関わらずクラスライブラリので3フォルトがAnyCPUのままである理由です。
次に,VC++2010は,設定次第で32bitの.exe/.dllも64bitの.exe/.dllも作成できます。
デフォルトでは32bitのものになっているはずです。
このため,普通に作って設定を触らなければ32bit用の物ができあがります。
設定を変えれば,64bit用の物(x64用やIA-64用)を作ることもできます。
ただし,インストール時に64bit用のコンパイラをインストールしている必要があります。
オフトピック
後からプログラムの修復でインストールしてもよいですが。

Re: dllの呼び出し

Posted: 2014年5月06日(火) 01:52
by dic
>>YuOさん

丁寧にありがとうございます。

おおよそわかりました。
あとは、ソースができるまでちょっとしてから、また見直します。

解決しました。