如何使用inline-c包装将指针返回到自定义结构类型的函数?

McB*_*den 2 haskell

我计划使用inline-c包装C函数:

lxw_workbook  *workbook  = workbook_new("filename.xlsx");
Run Code Online (Sandbox Code Playgroud)

我需要捕获返回的Ptr,以便以后在其他函数中使用。

问题:Ptr指向lxw_workbook,这是一个自定义结构。我是否需要为此Haskell类型编写一个存储实例?因为如果我不直接使用该结构,而仅使用Ptr,可以跳过此步骤吗?

HTN*_*TNW 5

type参数Ptr只是一个标记,以提醒您它所指向的内容。类型不需要是Storable或其他任何东西。请注意,您的情况并不新颖;C标准库包含像FILE这样的类型,它们只能像您一样通过指针访问。跟随他们的引导,您可以编写一个虚拟类型

data Workbook = Workbook -- constructor does not have to/should not be exported
Run Code Online (Sandbox Code Playgroud)

然后可以编写一个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 |] }
Run Code Online (Sandbox Code Playgroud)

然后可以照常加载

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") } ]
Run Code Online (Sandbox Code Playgroud)