私はいくつかの.o
ファイルで構成自分のDLLをコンパイルしています。 .o
のいずれかのファイルは、Windows 7のみでサポートされていSHLoadLibraryFromItem
を呼び出す機能があります。関数が呼び出されることはありませんDLLを使用するアプリケーションは、Windows 7上で実行されていない限り(はい、私は確信しています。)DLLを別のWindowsバージョンで使用するにはどうすればよいですか?
をただし、Windows(たとえば、XP)の古いバージョンのアプリケーションを実行する際に、起動時にアプリケーション全体がクラッシュし、「指定されたプロシージャを見つけることができませんでした」というエラーが表示されます。手順指定しないエラーが見つかりませんでしたが、私はSHLoadLibraryFromItem
への呼び出しをコメントアウトした場合、その後、すべてが正常に動作します。
質問:
- はなぜWindowsはそれがXP上で呼び出されていないにもかかわらず、
SHLoadLibraryFromItem
を見つけるためにしようとしていますか? - Windowsを使用する方法はありますかではなく、となります。つまり、Windows 7を実行しているとき、つまり何らかのレイジーバインディングしか見つからない場合は
SHLoadLibraryFromItem
となりますか? - ない場合は、この問題に対処する最善の方法は何ですか?
唯一の方法は、どちらか私は考えることができるよう、これを回避しているのです。
- 使用
LoadLibrary
SHLoadLibraryFromItem
がであることをWindowsのDLLをロードし、ポインタ対に手動でアドレスを取得するためにGetProcAddress
を使用します代わりにSHLoadLibraryFromItem
を呼び出すためにポインタを使用しますか? - は、2つのDLLを持っている:
他のアイデアのWindows 7上で動作しているときにのみロードされるのWindows 7でサポートされている機能が含まれているものを?私は本当に上記のようないくつかの種類の遅延バインディングを好むでしょう。
更新
私が実際に書いたものを読んでください。私ははっきりSHLoadLibraryFromItem
私はDLLはをロードしたときに、アプリケーションが実際に単にアプリケーションのクラッシュWINDOWS 7に
を実行していることを確実に知っている限り呼ばないであることを最初の段落で述べました。
個々のシンボルだけを遅延ロードすることはできません。 (私はLinuxでELF実行可能ファイルでこれを行うことができたことに慣れています) –
@Craig Ringer私はそうは思わない、リンカーへの遅延ロードパラメータはモジュールのリストです。技術的には、リンカはそれをかなり簡単に行うことができます。なぜなら、各関数のスタブを生成しているからです。しかし、それを実現する方法はないと思います。 –
@Craig Ringerおそらく私はあなたの質問を誤解していました...もしDLLが存在していて、あなたが参照している関数の1つがそうでなければ、リンカによって生成された遅延ロードコードはそれぞれ 'GetProcAddress()'呼び出しを別々に試みるべきです。行方不明のものは例外を生成しますが、他のものはまだ動作します。 –