Lescher Christian <[EMAIL PROTECTED]> writes:
> 
> I want to call a Haskell function with string arguments and a 
> string result from VBA (MS Access).
> I already know that the Com-Library of HDirect provides 
> marshallBSTR and unmarshallBSTR functions, but up to now I 
> didn't manage to get it working. (A beginner's fault, I suppose.)
> 
> What must the function definition of, let's say, a function
> 
>   f :: String -> IO String
> 
> look like in order to make it callable from VBA within a DLL 
> build with GHC?
> 

Here's a ripped out version of the code that the HDirect libraries
use to deal with BSTRs - you may find it easier to work with. To use,
here's what to do:

- attached is a .zip file containing a basic library for
  dealing with BSTRs from Haskell + some ultra-simple test code.
  (To build it, just type 'make' after having adjusted the
  definition of HC in the Makefile.)
- the .zip file contains the Haskell module BSTR, which provides
  two marshaling actions:

     type BSTR = Addr
     marshallBSTR   :: String -> IO BSTR
     unmarshallBSTR :: BSTR   -> IO String

  For arguments coming from VBA, use 'unmarshallBSTR' to convert
  them into Haskell strings, use 'marshallBSTR' when you want to
  pass a BSTR back to VBA, e.g., 

    -- exports upperCaseString
    foreign export stdcall upperCaseString :: BSTR -> IO BSTR

    upperCaseString :: BSTR -> IO BSTR
    upperCaseString bstr = do
        str  <- unmarshallBSTR bstr
        marshallBSTR (map Char.toUpper str)


hth
--sigbjorn


begin 600 bstr.zip
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
MWYRSJ;E<L*/&NE?D897&G+[!1'U?]=Z@+CW([EMAIL PROTECTED]\M?."3/Q26J2=QA[I
M&)MZI7%<F2]D6!`9WW[7?JON'_T/4$L!`A0`%`````@`T&$S*3._^2_4````
M+`$```@``````````0`@`+:!`````$UA:V5F:6QE4$L!`A0`%`````@`"&`S
M*7-DS"_\`@``]P8```H``````````0`@`+:!^@```&)S=')0<FEM+F-02P$"
M%``4````"``*8#,I'<<5^#X!``"K`@``"@`````````!`"``MH$>!```8G-T
M<E!R:6TN:%!+`0(4`!0````(`(M>,RG;292)60```'P````'``````````$`
M(`"V@80%``!-86EN+FAS4$L!`A0`%`````@`M&`S*=]O.R($`@``H00```<`
M`````````0`@`+:!`@8``$)35%(N:'-02P4&``````4`!0`0`0``*P@`````
`
end

Reply via email to