New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WindowsのVimにおいて、DLL関数の呼び出し規約はどうなっているのか #1122

Closed
rbtnn opened this Issue Nov 25, 2017 · 6 comments

Comments

Projects
None yet
3 participants
@rbtnn

rbtnn commented Nov 25, 2017

質問・報告の内容

経緯

私のWindows環境にて、以下のようなlibcallnr()で落ちましました。

echo libcallnr('User32.dll', 'IsZoomed', v:windowid)

libcallnr関数を調べていくと、GetProcAddress()の戻り値をMYINTPROCINTでキャストしています。その時に関数呼び出し規約が__cdeclだったために落ちてしまいました。

os_mswin.c 857行目付近
typedef int (*MYINTPROCINT)(int);

この型定義に__stdcallを明示的に付与したらlibcallnr()が落ちることなく動作しました。

質問

WindowsのVimにおいて、libcallもしくはlibcallnrのDLL関数の呼び出し規約はどうなっているのか。ビルド環境依存に任せてしまっている感じなのでしょうか?

以上、宜しくお願い致します。

Vimのバージョン

8.0.1333

OSの種類/ディストリ/バージョン

  • Windows

使用している or 関係していそうなプラグイン

なし

その他

なし

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Nov 25, 2017

Member

呼び出し規約は C calling conversion です。OS は何ビットですか?Vim が使っている型は int なので 32bit です。かたや渡そうとされているのはウィンドウハンドルで 64bit OS であれば 64bit です。

libcall を使って 64bit の値を渡すには、文字列化して渡すしかありません。例えば sprintf("%x", ptr) といった感じで渡し、受け取り側で sscanf するなど。

Member

mattn commented Nov 25, 2017

呼び出し規約は C calling conversion です。OS は何ビットですか?Vim が使っている型は int なので 32bit です。かたや渡そうとされているのはウィンドウハンドルで 64bit OS であれば 64bit です。

libcall を使って 64bit の値を渡すには、文字列化して渡すしかありません。例えば sprintf("%x", ptr) といった感じで渡し、受け取り側で sscanf するなど。

@rbtnn

This comment has been minimized.

Show comment
Hide comment
@rbtnn

rbtnn Nov 25, 2017

64-bit operating system, x64-based processor
Windows 10 Pro
です。

rbtnn commented Nov 25, 2017

64-bit operating system, x64-based processor
Windows 10 Pro
です。

@rbtnn

This comment has been minimized.

Show comment
Hide comment
@rbtnn

rbtnn Nov 25, 2017

呼び出し規約は C calling conversion です。

__cdeclC calling conversionが頭の中で紐づきませんでした。
Helpにも書いてありますね。

libcall を使って 64bit の値を渡すには、文字列化して渡すしかありません。例えば sprintf("%x", ptr) といった感じで渡し、受け取り側で sscanf するなど。

これはC側の話ですよね? Vim script側では可能なのでしょうか?

rbtnn commented Nov 25, 2017

呼び出し規約は C calling conversion です。

__cdeclC calling conversionが頭の中で紐づきませんでした。
Helpにも書いてありますね。

libcall を使って 64bit の値を渡すには、文字列化して渡すしかありません。例えば sprintf("%x", ptr) といった感じで渡し、受け取り側で sscanf するなど。

これはC側の話ですよね? Vim script側では可能なのでしょうか?

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Nov 25, 2017

Member

Vim script の number は(最近は) 64bit なのですが、libcall を呼び出した時点でキャストされてしまいます。

Member

mattn commented Nov 25, 2017

Vim script の number は(最近は) 64bit なのですが、libcall を呼び出した時点でキャストされてしまいます。

@mattn

This comment has been minimized.

Show comment
Hide comment
@mattn

mattn Nov 25, 2017

Member

IsZoomwin を呼び出すのであれば、IsZoomwin を呼び出す dll を自作するしかないという意味でした。

Member

mattn commented Nov 25, 2017

IsZoomwin を呼び出すのであれば、IsZoomwin を呼び出す dll を自作するしかないという意味でした。

@rbtnn

This comment has been minimized.

Show comment
Hide comment
@rbtnn

rbtnn Nov 25, 2017

IsZoomwin を呼び出すのであれば、IsZoomwin を呼び出す dll を自作するしかないという意味でした。

なるほど。理解しました。

ありがとうございます。

rbtnn commented Nov 25, 2017

IsZoomwin を呼び出すのであれば、IsZoomwin を呼び出す dll を自作するしかないという意味でした。

なるほど。理解しました。

ありがとうございます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment