rust
1println!("{:?}", CreateFileW as LPVOID);
2println!("{:?}", CreateFileW as *const ())
試してませんが、上のやり方で合っていると思います。なおフォーマットとして{:p}
を使うと、わざわざ別の型に変換しないでアドレスが表示できるはずです。
rust
1println!("{:p}", CreateFileW);
同じプロセス上でC++とRustのコードを実行して試したのですが、このどちらもがC++と同じ結果になりませんでした。
まず、Rustのwinapiクレート上のCreateFileW
関数の定義を確認したところ、以下のようになっていました。extern
指定を使うことでWindows APIライブラリーの素の関数を直接使用しています。
rust
1pub unsafe extern "system" fn CreateFileW(
2 lpFileName: LPCWSTR,
3 dwDesiredAccess: DWORD,
4 dwShareMode: DWORD,
5 lpSecurityAttributes: LPSECURITY_ATTRIBUTES,
6 dwCreationDisposition: DWORD,
7 dwFlagsAndAttributes: DWORD,
8 hTemplateFile: HANDLE
9) -> HANDLE
winapiクレートはドキュメントがほとんどないのでよくわからないのですが、恐らくC++プログラムから動的リンクされているWindows APIとは違うものを使っているようです。デフォルトではRustプログラムをwinapiクレートにバンドル(同梱)されているWindows APIのライブラリーと静的リンクするようです。
winapiクレートビルドスクリプト
winapiクレートにバンドルされているライブラリー
RustとC++で別のライブラリーにリンクされているので、異なったアドレスが表示されるのではないでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/29 09:45
2021/09/29 10:43 編集