ページ 1 / 1
32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月15日(金) 10:48
by 若葉
32bitのMS windows 7 のプログラムを開発しましたが、
これは主に64bitのマシン上で実行します。
なので、将来このプログラムから64bitのdllをも利用したいですが、
直接関係ない32bitのLib, object, dllをそのままで、
ある部分だけ64bitのdllを導入することは可能でしょうか。
(理論上問題ないでしょうか)
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月15日(金) 12:20
by YuO
プロセスにおいても,リンカのリンク対象においても,x86用コードとx64用コードを混ぜることはできません。
32bitプロセスからx64用DLLを使う場合は,64bitプロセスを用意して,プロセス間通信を行って呼び出す必要があります。
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月16日(土) 11:13
by 若葉
さっそくご教授本当にありがとうございます。
32bit appから、64bit のDLLをコールするのは無理であっても、
逆の場合はどうでしょう。
すなわち、64bit appから、32bit のDLLをコールすることは
場合によって成功する可能性もあるでしょうか。
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月16日(土) 12:31
by YuO
若葉 さんが書きました:32bit appから、64bit のDLLをコールするのは無理であっても、
逆の場合はどうでしょう。
すなわち、64bit appから、32bit のDLLをコールすることは
場合によって成功する可能性もあるでしょうか。
ありません。再掲しますが,
YuO さんが書きました:プロセスにおいても,リンカのリンク対象においても,x86用コードとx64用コードを混ぜることはできません。
です。
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月16日(土) 16:23
by 若葉
お世話になっております。
64bitと32bit静的に混ぜる事ができないのはよくわかりました。
ありがとうございます。
ただ、DLLというものは正に動的なもので、概念的に
実行する時、初めて「リンク」されるのではないでしょうか。
" Dynamic Link Library" ですよね。
という事は、実行する時にDLL call時点でハングアップでしょうか。
実は今は知らない人が作ったプログラムを実行する時に
原因不明にハングアップしてしまっています。
64bitと32bitの DLLが混在しているのではないかと疑っていますが。
また何かヒントいただければ、大変助かります。
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月17日(日) 10:50
by Bull
実行環境が良くわからないのですが、64bit Windows で 32bit Exe を実行する場合と考えてよろしいですか?
まず、DLL のリンクには明示的リンクと暗黙的リンクがあるのはご存じだと思いますが、32bitのEXEから64bit
のDLLをコールしようとした場合、明示的リンクでは、LoadLibrary() でエラーになりますし、暗黙的リンクでは
プログラムの開始時にエラーになると思います。どちらもハングアップすることはないはずです。
プログラムがハングアップするのは別の原因ではないのですか?
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月17日(日) 10:59
by Bull
ちょっと書き漏らしました。
暗黙的リンクならば Dependency Walker を使用してリンクしている DLL は特定できます。
明示的リンクでも、ある程度は調査できます。
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月18日(月) 11:44
by YuO
若葉 さんが書きました:64bitと32bit静的に混ぜる事ができないのはよくわかりました。
動的でも無理です。
もう一度再掲しますが,
YuO さんが書きました:プロセスにおいても,リンカのリンク対象においても,x86用コードとx64用コードを混ぜることはできません。
です。
「プロセスにおいても」をちゃんと理解していますか。
これは実行時の話をしています。
32bitプロセスとして起動したプロセス空間内に,x64用のDLLを実行可能な状態で読み込むことはできませんし,
64bitプロセスとして起動したプロセス空間内に,x86用のDLLを実行可能な状態で読み込むこともできません。
若葉 さんが書きました:実は今は知らない人が作ったプログラムを実行する時に
原因不明にハングアップしてしまっています。
64bitと32bitの DLLが混在しているのではないかと疑っていますが。
プログラムを自分で作ったのではないのですね (元々の質問の前提条件は,自分で開発したプログラムについてでしたが)。
混在を疑っている理由は何ですか。
例えば,
Windows Sysinternalsの
Process Explorerで読み込んでいるDLLを見たら混在していた,のような場合であれば,正統な理由だと思います。
また,Windowsのアプリケーションログに記録されたファイル名などから疑うこともあるでしょう。
ただ,WindowsがOSレベルでできないようにしているとされていることを,単純に自身の直感だけで疑うのは無意味だと思います。
Re: 32bitのwindows 7 のプログラムに64bitのdll
Posted: 2014年8月19日(火) 04:06
by YuO
一応,MSDNへのリンク
Process Interoperability
オフトピック
32bit/64bitの混在不可はMSの開発者向イベントで何度も聞いた話なので完全に「前提条件」扱いしていましたが,探したら当然ですがちゃんとMSDNに書いてありました。