首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >罗伯特·吉塞克的非管理出口条件

罗伯特·吉塞克的非管理出口条件
EN

Stack Overflow用户
提问于 2018-04-22 21:57:58
回答 1查看 609关注 0票数 0

我正在从VBA工作到.NET。

我正在尝试删除C++ 2015运行时上的依赖项,看起来我可以使用UnmanagedExports来完成它。

但我有几个问题。

  1. 我可以只使用"ref字符串“作为参数并让它工作吗?
  2. 如果是,我可以用"out string“替换它吗?
  3. 在这两种情况下,我是否必须执行任何字符串/字符串长度管理?
  4. 目前,我以"int“的形式传递了几个回调。从我在其他地方看到的一个例子来看,在C#端,使用它,我应该能够用Func替换那些参数作为回调函数,比如函数A(p1作为字符串,p2作为字符串,p3作为字符串)。

如有任何建议,将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-04-24 01:21:51

您需要将StrPtr (可能是访问端的StrConv )和.NET端的IntPtr组合起来:

代码语言:javascript
运行
复制
        'VBA7    
        Private Declare PtrSafe Function Command Lib "External.dll" (ByVal CommandName As String, ByVal Result As LongPtr, ByRef ResultLength As Long) As Long
        'VBA pre7
            Private Declare Function Command Lib "External.dll" (ByVal CommandName As String, ByVal Result As Long, ByRef ResultLength As Long) As Long

'Example to use.
'Result will be up to "i" characters - no new string involved
            Dim i As Long, x As Long, strResult As String
            i = 100
            strResult = Space(i)
            x = Command(CommandName, Arguments, StrPtr(strResult), i)

如果使用StrConv,则字符串类型由您决定。如果没有,指针将指向Unicode数组。

C#侧:

代码语言:javascript
运行
复制
    [DllExport("Command", CallingConvention.StdCall)]
    public static int Command(string commandName, string arguments, IntPtr result, out /*or ref*/ int resultLength)
{
       string inputStr = Marshal.PtrToStringUni(result); //Unicode
       resultLength = inputStr.Length;
       int x = MainFunc.Command(commandName, arguments, ref inputStr);
       if(null == inputStr)
       {
            inputStr = "";
       }
       if(inputStr.Length > resultLength)
       {
            inputStr = inputStr.Substring(0, resultLength);
        }
        byte[] outputBytes = Encoding.Unicode.GetBytes(inputStr);
        Marshal.Copy(outputBytes, 0, result, outputBytes.Length);
        resultLength = inputStr.Length;
        return x;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49971134

复制
相关文章

相似问题

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