Хорошо, я немного схожу с ума здесь.
У меня есть это объявление 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;
}
имя_команды и аргументы правильно вводятся из VBA.
resultLength возвращается обратно в VBA.
Если я отлаживаю, кажется, что str2 содержит правильное значение (шестнадцатеричное значение, за которым следует правильная строка в отладчике)
Если я раскомментирую // результат = str2; линия, я получаю крах.
Повторные попытки отладки приводят меня к этой информации об ошибке:
* MSACCESS.EXE вызвал точку останова. произошло
ntdll.dll!_RtlReportCriticalFailure@12() Unknown Symbols loaded.
oleaut32.dll!_SysFreeString@4() Unknown Symbols loaded.
Куча была повреждена
0xC0000374 *
Поэтому я подозреваю, что мне нужно что-то закрепить или удержать выделение строки перед ее передачей обратно в VBA.
Объявление VBA6 для Win32:
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. Нет аварии, хотя.
Задача ещё не решена.
Других решений пока нет …