Вызов c dll из С++, С# и ruby

Привет У меня есть DLL с функцией, которую мне нужно вызвать. Подпись:

const char* callMethod(const char* key, const char* inParams);

Если я использую ruby, все работает нормально:

attach_function :callMethod, [:string, :string], :string

Если я использую С++ или С#, я получаю переполнение стека!?

С#:

[DllImport("DeviceHub.dll", CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern IntPtr callMethod(
    [MarshalAs(UnmanagedType.LPArray)] byte[]  key,
    [MarshalAs(UnmanagedType.LPArray)] byte[] inParams
);

System.Text.UTF8Encoding encoding = new UTF8Encoding();
IntPtr p = callMethod(encoding.GetBytes(key), encoding.GetBytes(args)); // <- Qaru here

С++:

extern "C"
{
typedef  DllImport const char*  (  *pICFUNC) (const char*, const char*); 
}
HINSTANCE hGetProcIDDLL = LoadLibrary(TEXT("C:\\JOAO\\Temp\\testedll\\Debug\\DeviceHub.dll"));  
FARPROC lpfnGetProcessID = GetProcAddress(HMODULE (hGetProcIDDLL),"callMethod");*      pICFUNC callMethod;
callMethod = (pICFUNC) lpfnGetProcessID;
const char * ptr = callMethod("c", "{}");

Я пробовал много вариантов для вызова функций: WINAPI, PASCAL, stdcall, fastcall,... ничего не работает.

DLL не была создана мной, и я не контролирую ее.

Может кто-нибудь помочь мне с любым предложением!

Ответ 2

Это всего лишь идея, но AFAIK это может быть проблемой для строк с нулевым завершением, const char* myvar имеет нулевое завершение, но байт-массив не является. Все, что вам нужно сделать, это изменить вызов на ...(String a, String b) и выделить их как LPStr.

Ответ 3

Я не вижу причин, по которым вы не должны менять свой вызов на

[DllImport ( "DeviceHub.dll", CallingConvention = CallingConvention.Cdecl)]
частная небезопасная статическая внешняя строка callMethod (
    строковый ключ,
    строка inParams
);

Вам нужно отправить указатели, а не фактические значения/байты в функцию.
Я всегда использую это mapping при генерации преобразования типов для собственных вызовов функций.
То же самое касается кода С++, вам нужно создать переменные с содержимым и вызвать функцию.

Ответ 4

Исключение - ошибка, наложенная на языки Microsoft, для предотвращения бесконечной рекурсии и предотвращения взаимодействия несовместимых программ друг с другом. Если ваш метод dll использует рекурсию, попробуйте переписать его с помощью итерации. В противном случае сделайте, как сказал Ове, и попробуйте со строками. Если он по-прежнему не работает, Google для совместимого типа. Это все, что я могу сказать, не зная фактического метода.