将字符串从C ++ / CLI传回VBA

时间:2018-01-25 10:18:44

标签: c# c++ access-vba

好的,我在这里有点生气。 我有这个C ++ / CLI声明:

extern "C" __declspec(dllexport) int __stdcall Command(const char* commandName, const char* arguments, char* %result, int %resultLength) {
    System::String^ commandNameS = gcnew System::String(commandName);
    System::String^ argumentsS = gcnew System::String(arguments);
    System::String^ resultS = gcnew System::String(' ', 1000);
    int x = MainFunc::Command(commandNameS, argumentsS, resultS);
    resultLength = resultS->Length;

    char* str2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(resultS);

    //result = str2;
    return x;
}

commandName和arguments从VBA正确进入。

resultLength正确返回VBA。

如果我调试,str2似乎保持正确的值(十六进制值,后跟调试器中的正确字符串)

如果我取消注释// result = str2;我发生了撞车事故。 重复调试尝试让我收到此错误信息:

* MSACCESS.EXE已触发断点。发生

ntdll.dll!_RtlReportCriticalFailure@12()    Unknown Symbols loaded.
oleaut32.dll!_SysFreeString@4() Unknown Symbols loaded.

堆已损坏 0xC0000374 *

所以我怀疑在将字符串传递回VBA之前我需要一些东西来固定或保留字符串的分配

Win32的VBA6声明:

Private Declare Function Command Lib "External.Win32.dll" (ByVal CommandName As String, ByVal Argument As String, ByRef Result As String, ByRef ResultLength As Long) As Long

修改 使用* result = * str2;显示结果等于str2中的第一个字符,但似乎仍然在VBA端产生一个空字符串。虽然没有崩溃。

0 个答案:

没有答案