67388


# 前置き

Haskellで外部のライブラリの関数を呼び出す際には

[code]

    import Foreign.C.Types
    
    foreign import ccall(またはstdcall) "SampleFunction" sampleFunction :: IO ()
    
    main = sampleFunction 
    
[/code]

のようにすると思います．

今回user32.dllのSetProcessDpiAwarenessContext関数を使おうと思い，

[code]

    import Foreign.C.Types
    import System.Win32.Types
    
    type DPI_AWARENESS_CONTEXT = CIntPtr;
    dPI_AWARENESS_CONTEXT_UNAWARE :: DPI_AWARENESS_CONTEXT
    dPI_AWARENESS_CONTEXT_UNAWARE = -1
    
    foreign import stdcall "SetProcessDpiAwarenessContext" 
        setProcessDpiAwarenessContext :: DPI_AWARENESS_CONTEXT -> IO (BOOL)
    
    
    main = do
      setProcessDpiAwarenessContext dPI_AWARENESS_CONTEXT_UNAWARE
      -- win32api codes
    
[/code]

このようなコードを書きビルドしました．

しかし，リンクの段階が通らず

[code]

    `SetProcessDpiAwarenessContext' に対する定義されていない参照です
    
[/code]

とエラーメッセージが表示されました．

# 質問

SetProcessDpiAwarenessContext関数が未定義参照にならないようにするにはどうすればよいでしょうか．  
また，同じようにWin32APIの関数をimportする際に何か注意点はあるでしょうか．

### その他補足情報

Windows 10
バージョン：1903(SetProcessDpiAwarenessContextは1703の時に追加された関数なので1903のuser32.dllには存在しています．)  
ghcのバージョン：8.8.3  
ビルドツール：stack 2.1.3(.cabalファイルのexecutableの項目にはextra-libraries: user32を追加しています．)


CC BY-SA 4.0
2020-06-07T06:33:53.757
67387
2020-06-07T10:19:03.040
32650
question
haskell winapi dll
Haskell(ghc)からuser32.dllの関数を呼び出そうとした際に未解決参照となる


当該APIは比較的新しいため、GHC 8.8.3に付属するmingw-w64に含まれる `user32.dll`
用のインポートライブラリ（`libuser32.a`）には `SetProcessDpiAwarenessContext` が含まれていないようです。

GHC 8.10.1にはより新しいmingw-w64が含まれているので、「GHC 8.8.3の代わりにGHC
8.10.1を使う」というのが解決策の一つとなります。`stack --compiler=ghc-8.10.1 build`
という風にstackを実行すればGHC 8.10.1を使うことができます。


CC BY-SA 4.0
2020-06-07T10:19:03.040
67388
2020-06-07T10:19:03.040
37927
67387
answer