我计划使用inline-c
来包装C函数:
lxw_workbook *workbook = workbook_new("filename.xlsx");
我需要捕获返回的Ptr,以便以后在其他功能中使用。
问题: Ptr指向lxw_workbook,这是一个自定义结构。我是否需要为此Haskell类型编写一个存储实例? 因为如果我不直接使用该结构,而仅使用Ptr,可以跳过此步骤吗?
我计划使用inline-c
来包装C函数:
lxw_workbook *workbook = workbook_new("filename.xlsx");
我需要捕获返回的Ptr,以便以后在其他功能中使用。
问题: Ptr指向lxw_workbook,这是一个自定义结构。我是否需要为此Haskell类型编写一个存储实例? 因为如果我不直接使用该结构,而仅使用Ptr,可以跳过此步骤吗?
Ptr
的type参数只是一个标记,以提醒您所指向的内容。类型不必为Storable
或其他任何值。请注意,您的情况并不新颖; C标准库包含FILE
之类的类型,它们只能像您一样通过指针访问。跟随他们的带领,您可以编写一个虚拟类型
data Workbook = Workbook -- constructor does not have to/should not be exported
然后您可以编写一个包含该类型的Context
:
import qualified Data.Map as M
import qualified Language.C.Inline.Context as C
import qualified Language.C.Inline.Types as C
lxwContext :: C.Context
lxwContext = mempty { ctxTypesTable = M.singleton (C.TypeName "lxw_workbook") [t| Workbook |] }
随后可以照常加载
import qualified Language.Inline.C as C
C.context (baseCtx <> lxwContext)
C.include "whatever.h" -- wherever you get workbook_new from
example :: IO (Ptr Workbook)
example = [C.exp| lxw_workbook* { workbook_new("filename.xlsx") } ]