在F#中的模块中包装DLL导入

时间:2014-08-07 20:55:21

标签: f# dllimport

我正在尝试为user32.dll的某些windows api函数创建一个“包装器”模块。我还在学习F#所以我对F#中的继承和多态如何工作以及如何将其应用于这种情况非常模糊。

我有这个模块:

module MouseControl =         
    [<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
    extern void ShowCursor(bool show)

    [<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
    extern void internal mouse_event(int flags, int dX, int dY, int buttons, int extraInfo)
    let MouseEvent(flags, dX, dY, buttons, extraInfo) = mouse_event(flags, dX, dY, buttons, extraInfo)

我的目标是能够从使用此模块的其他代码中“隐藏”mouse_event函数,而是将该函数公开为MouseEvent。使用此代码 mouse_eventMouseEvent当前可用于调用此模块的代码。如何将mouse_event隐藏在模块的私有位置?

1 个答案:

答案 0 :(得分:6)

在您的代码示例中,您已将mouse_event函数标记为internal - 因此原则上您只需将其标记为private即可。但是,看起来F#编译器忽略了extern成员上的可见性注释,因此最简单的选择是将它们放在嵌套模块中并隐藏整个嵌套模块:

module MouseControl =         
  module private Imported = 
    [<DllImport( "user32.dll", CallingConvention = CallingConvention.Cdecl )>]
    extern void mouse_event(int flags, int dX, int dY, int buttons, int extraInfo)

  let MouseEvent(flags, dX, dY, buttons, extraInfo) = 
    Imported.mouse_event(flags, dX, dY, buttons, extraInfo)

模块Imported现在只在MouseControl模块中可见。从外面看,您无法访问MouseControl.Imported内的任何内容。