首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell Win32 LPCTSTR IsString台风

Haskell Win32 LPCTSTR IsString台风
EN

Stack Overflow用户
提问于 2018-12-17 13:44:20
回答 1查看 40关注 0票数 0

我正在测试incline-c的win32 api。我意识到LPCTSTR没有IsString实例。但我不知道怎么写。有什么暗示吗?

供参考:

代码语言:javascript
复制
type LPTSTR = Ptr TCHAR
type TCHAR = CWchar

System.Win32.Types中定义

代码语言:javascript
复制
newtype CWchar

Haskell type representing the C wchar_t type.

Constructors
CWchar Int32    

这是我的密码:

代码语言:javascript
复制
{-# 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实现了这一点

代码语言:javascript
复制
{-# 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"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-17 14:10:05

这个实例不能被合理地定义,同样的原因是它不能用CString来完成:指向char的指针不能执行内存管理。因此,在运行时生成C-字符串不是不安全的,就是不安全的,或者导致内存泄漏。

原则上应该能够访问字符串文本,这在C本身中也是可能的:只需在编译时分配一个静态内存位置即可。但是IsString类不支持这一点。

总之:C-字符串在Haskell中很难使用,所以最好只在C代码的接口上直接使用它们。也就是说,如果您甚至编写了一个带有argument的C函数的低级包装器,那么这应该以StringText作为参数。将其转换为IO块中的适当C-字符串,然后与unsafePerformIO一起“净化”它们。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53816503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档