せっかくF#を覚えるなら何か作らなければと思い立ち、作り始めたのですが、おやっ?!作りたい物が、Win32 API使わないと、できない感じです。そこで、F#でWin32APIを呼ぼうと思ったんです。でも、なかなか良い資料が見あたりません。

少ない資料を見ながら作ってみました。そして、その手始めに、MessageBoxW()を呼んだのが以下です。LPWStr呼ぶ場合、ちょっと宣言が面倒ですが、ばっちりWin32APIも使えますね。

open System
open System.Text
open System.Runtime.InteropServices

[<DllImport(@"user32.dll", EntryPoint="MessageBoxW")>]
extern int MessageBox(
    UInt32 hWnd, 
    [<MarshalAs(UnmanagedType.LPWStr)>]String lpText, 
    [<MarshalAs(UnmanagedType.LPWStr)>]String lpCaption, 
    UInt32 uType)

MessageBox(0u, "Hello!", "test", 0u) |> ignore

後日談 (2/21追記) *

 コメントにも書きましたが、結局、いろいろやった上で・・・Win32 APIを使う時は、C#でDLLを作って、それをF#から呼ぶことにしました。C#の方がAPIをラップしたコードがネット上に多いので、わざわざF#に翻訳することに疲れました。そして、多言語で書いても、ほとんど同じ手順でライブラリを呼び出せる.Netの素晴らしさを実感しました。それぞれの言語で、得意なものを作って、最後に合体させるのが本当に簡単です。