gpt4 book ai didi

c# - Excel DNA - 在回调中将 C# 字符串编码到 VBA ByRef

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:18 25 4
gpt4 key购买 nike

我正在尝试使用 Excel-DNA 从 C# 代码调用 Excel 中的 VBA 回调。在弄乱了特定的数据类型和编码声明之后,我终于能够创建一个工作示例:

C# 代码

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDispatch)]
[ProgId("CSharpComObject")]
public partial class CSharpComObject
{
Dictionary<string, Callback> _callbackMap = new Dictionary<string, Callback>();


public void SubscribeStringData(string topic, [MarshalAs(UnmanagedType.FunctionPtr)] Callback callback)
{
_callbackMap[topic] = callback;
}

public void RaiseCallback(string topic, string data)
{
_callbackMap[topic](data);
}

public delegate void Callback([MarshalAs(UnmanagedType.BStr)] string data);
}

VBA 模块

Option Explicit

Dim testObj As Object



Sub Subscribe()

Set testObj = CreateObject("CSharpComObject")

testObj.SubscribeStringData "someTopic", AddressOf StringDataCallback

End Sub



Sub StringDataCallback(ByVal data As String)

MsgBox "StringDataCallback Raised [" + data + "]"

End Sub

问题

正如您从上面的代码示例中看到的,默认的 COM 字符串编码是 BStr a.k.a. ByVal ... As String

我想知道是否有一种方法可以将字符串数据(或与此相关的任何对象类型)传递给 VBA 回调 ByRef,如果可以,那么 C# 声明和编码属性需要什么是吗?

最佳答案

将参数指定为 ref string 应该可行。

参见 https://msdn.microsoft.com/en-us/library/s9ts558h(v=vs.110).aspx有关字符串编码(marshal)处理选项的更多信息。

关于c# - Excel DNA - 在回调中将 C# 字符串编码到 VBA ByRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36181121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com