У меня есть функция DLL, которая принимает параметры BSTR. Они передаются как char * перед тем, как их использовать для других вещей.
Когда dll вызывается из кода VBA, это работает. Однако, когда он вызывается из кода C #, указывается только первый символ.
Обе они являются надстройками Excel для версий Office, выпущенных до 2007 года и более поздней версии 2007 года и использующих более быстрый C ++ AddIn. Они называют это напрямую, а не через Excel.
Объявление функции VBA:
Private Declare Function Test Lib "ExcelAddIn.xll" (ByVal param As String) As String
Объявление функции C #:
[DllImport("ExcelAddIn.xll", CharSet=CharSet.Ansi)]
[return:MarshalAs(UnmanagedType.BStr)]
private static extern string Test([MarshalAs(UnmanagedType.BStr)] string param);
При отладке dll и просмотре входных значений BSTR они кажутся правильными из обоих; только C # один бросает только первый символ.
Charset=CharSet.Unicode
не имеет значения.
код C ++.
BSTR __stdcall Test(BSTR param)
{
char* Param= "";
if(param!= NULL)
Param= (char*)param;
return OtherClass.DoOtherStuff(Param);
}