我正在测试incline-c的win32 api。我意识到LPCTSTR没有IsString实例。但我不知道怎么写。有什么暗示吗?
供参考:
type LPTSTR = Ptr TCHAR
type TCHAR = CWchar在System.Win32.Types中定义
和
newtype CWchar
Haskell type representing the C wchar_t type.
Constructors
CWchar Int32 这是我的密码:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
import Data.String
import qualified Language.C.Inline.Win32 as CW
import qualified Language.C.Inline as C
import System.Win32.Types
instance IsString LPCTSTR where
C.context CW.win32Ctx
C.include "<windows.h>"
showMsg :: LPCTSTR -> IO INT
showMsg s = do
[C.exp| INT{ MessageBox( NULL, $(LPCTSTR s), "Haskell Rocks", MB_OK )} |]
main = showMsg "Hello Haskell"编辑:我已经成功地用ByteString实现了这一点
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
import qualified Data.ByteString as BS
import qualified Language.C.Inline.Win32 as CW
import qualified Language.C.Inline as C
import System.Win32.Types
C.context (CW.win32Ctx <> C.bsCtx)
C.include "<windows.h>"
showMsg :: BS.ByteString -> IO INT
showMsg s = do
[C.exp| INT{ MessageBox( NULL, $bs-ptr:s, "Haskell Rocks", MB_OK )} |]
main = showMsg "Hello Haskell"发布于 2018-12-17 14:10:05
这个实例不能被合理地定义,同样的原因是它不能用CString来完成:指向char的指针不能执行内存管理。因此,在运行时生成C-字符串不是不安全的,就是不安全的,或者导致内存泄漏。
原则上应该能够访问字符串文本,这在C本身中也是可能的:只需在编译时分配一个静态内存位置即可。但是IsString类不支持这一点。
总之:C-字符串在Haskell中很难使用,所以最好只在C代码的接口上直接使用它们。也就是说,如果您甚至编写了一个带有argument的C函数的低级包装器,那么这应该以String或Text作为参数。将其转换为IO块中的适当C-字符串,然后与unsafePerformIO一起“净化”它们。
https://stackoverflow.com/questions/53816503
复制相似问题