問題タブ [getprocaddress]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - GetProcAddress はすべての関数に対して 0 を返します
まず第一に、私はこれをしばらく検索しましたが、私のケースに関連する回答が見つかりません。基本的に、私は Windows DLL (dnsapi.dll) の関数のアドレスを取得しようとしていますが、GetProcAddress は 0 を返しています。 dll. 同じ結果です。これは私が作成した 2 番目のプログラムのコードで、まだ動作しません。
ところで、GetLastError は 127 を返します。これは、GetProcAddress が機能しないときに返される最も一般的なエラーのようですが、何が問題なのかわかりません。これらのカップルだけでなく、多くの関数と DLL で試しました。
ありがとう。:)
編集:リンクされた記事は私の問題を解決しました。私が試した機能にはすべてユニコードとアニスのバージョン(wとa)がありました。完全な API 名を使用すると、問題が解決しました。その質問をリンクしてくれてありがとう。
ありがとうございました。
c++-cli - C++/CLI DLL の LoadLibrary と GetProcAddress - 2 回読み込まれる
次のことを行う C ファイルを含む .vcxproj があります。
Process Explorer を使用して LoadLibrary を呼び出すと、「tube.dll」が読み込まれます。上記の行を呼び出すと、rtn = (pfn)(pData)
「tube.dll」が再度読み込まれます!!
この dll (tube.dll) は、/clr でコンパイルされた混合アセンブリ (C++/CLI) です。"tube.dll" の 2 番目のインスタンスが clr コンテキストに読み込まれる可能性はありますか? もしそうなら、それを防ぐ方法は?を使用するには DLL を 1 回ロードする必要がありますがGetProcAddress
、関数を呼び出すときに再度ロードする必要はありません。
c++ - GetProcAddress() C++ VBexpress 13 を使用して関数が見つからない
わかりましたので、ここで危険なほど再投稿に近づいていますが、私の状況は、この機能に関する他の多くのポスターとは少し異なります. 私は昔に書かれた DLL とやり取りしていますが、私が持っているのはファイルだけです。私は .lib ファイルを持っていないので、LoadLibrary および GetProcessAddress 関数を使用しています。MSDN Web サイトのチュートリアルに従って、基本的な構造を取得しました。DLL はプロジェクト フォルダにあります。コンパイルします。実行時に「hinstLib」の数値を取得しているので、DLL が見つかったと想定しています。「ProcAdd」変数の null 値を取得しています。他の投稿者は、extern C を DLL 関数に入れることで問題を解決しましたが、実際にはそのオプションはありません。言うまでもなく、私の知る限り、この DLL はプレーンな C で書かれています。私はインターフェイス ドキュメントを持っており、関数名が正しいことを確信しています (これらの目的のために一般的な例に置き換えました)。ProcAdd 割り当てが NULL になったため、正直なところ何も実行しませんでした。なぜこれが関数の割り当てに0の値を与えているのかについての考えは大歓迎です。注: 残念ながら、さまざまな理由により、DLL をアップロードできません。
}
dll - NULL を返す GetProcAddress
LoadLibrary と GetProcAddress を使用して dll をロードしようとしています。LoadLibrary は有効なハンドルを返しますが、GetProcAddress を呼び出すと NULL が返されます。GetLastError を呼び出すと、ERROR_INVALID_PARAMETER である 87 が返されます。GetProcAddress に渡す関数名がdumpbin /exports
、dll で実行したときに返されるものと同じであることを確認しました。残念ながら、これは仕事用なので、実際のコードを含めることはできません。しかし、これは私が何をしているのかを理解してもらうために編集されたバージョンです。
SO や他のフォーラムで関連する質問をいくつか見てきましたが、通常、この問題は C++ の名前マングリングが原因です。表示されているものと同じ名前を使用しているので、dumpbin
これは私の問題ではないと思います。何か案は?
アップデート
問題を絞り込めたのではないかと思います。ターゲットには、この dll の古いバージョンが存在します (これは組み込みの WinCE ソリューションです)。しかし、必要な追加機能を備えた新しいバージョンの dll を使用する必要があります。残念ながら、古い dll を更新できません。この新しい dll と dll を使用するアプリケーションは、ターゲットにロードされる cab ファイルにパックされます。古いdllのいくつかの関数でGetProcAddressを試してみましたが、それらは機能しました。そのため、新しい dll へのパスを使用して LoadLibrary を呼び出しているにもかかわらず、実際には既にターゲットにある dll をロードしているだけのようです。これが起こることを誰かが確認できますか?
前の質問への回答
Windows CE が DLL をロードすると、DLL が既にロードされているかどうかを判断する際に、すべてのパス情報が無視されます。これは、名前が同じでパスが異なる DLL を一度しかロードできないことを意味します。さらに、拡張子 .cpl で終わるモジュールは、拡張子が .dll であるかのように扱われます。
visual-c++ - 名前が正しくマングルされていても GetProcAddress が失敗する
.dll に次のコードがあります。
これは Visual C++ 2010 でコンパイルされているため、.def ファイルを含む .def ファイルもありますGetOptionID
。関数がエクスポートされ_GetOptionID@4
、dumpbin /exports を使用してマングルされていることがわかります。
別の実行可能ファイルで、次の存在を確認しようとしましたGetOptionID
:
デバッガーでこのコードを実行すると、次のことがわかります。
LoadLibraryEx
成功 - 私は有効に見えるhinst
GetProcAddress
失敗 -lp
です0x00000000
GetLastError
127を返します
関数がエクスポートされていることがわかり、その名前が探しているエントリ ポイントと一致することがわかります。どうしてGetProcAddress
失敗するの?