Я читал другие подобные вопросы по этому вопросу, но они не решают эту конкретную проблему. У меня есть старая C-библиотека с функцией touppercase (как пример). Это берет символ * и возвращает символ *. Однако возвращенный указатель является указателем на ту же строку (не спрашивайте меня, я ее не писал).
Функция выглядит так:
__declspec(dllexport)
char * __cdecl touppercase(char *ps_source)
{
char *ps_buffer = NULL;
assert (ps_source != NULL);
ps_buffer = ps_source;
while (*ps_buffer != '\0')
{
*ps_buffer = toupper(*ps_buffer);
ps_buffer++;
}
*ps_buffer = '\0';
return (ps_source);
}
Код C # для объявления этого выглядит следующим образом:
[DllImport("mydll.dll", EntryPoint = "touppercase",
CharSet = CharSet.Ansi, ExactSpelling = true,
CallingConvention = CallingConvention.Cdecl)]
private static extern System.IntPtr touppercase(string postData);
вызов этого в моем приложении выглядит как
string sTest2 = Marshal.PtrToStringAnsi(to_uppercase(sTest));
Однако sTest2 просто оказывается случайной строкой.
Я добавил тестовую функцию в ту же DLL с теми же параметрами, но это распределяет память локально и копирует строку. Это отлично работает. Почему теперь работает оригинальная версия?
Примечание. Обновление самих библиотек dll невозможно.