Witam Mam bibliotekę DLL z funkcją, do której muszę zadzwonić. Podpis brzmi:Wywołanie biblioteki dll z C++, C# i ruby
const char* callMethod(const char* key, const char* inParams);
Jeśli używam rubinowy wszystko działa poprawnie:
attach_function :callMethod, [:string, :string], :string
Jeśli używam C++ lub C# mam przepełnienie stosu!
C#:
[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)); // <- stack overflow here
C++:
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", "{}");
Próbowałem wiele wariacji na wywołanie funkcji: winapi Pascal, stdcall, fastcall ... nic nie działa.
DLL nie został stworzony przeze mnie i nie mam nad nim kontroli.
Czy ktoś może mi pomóc z każdą sugestią !?
Możesz rzucić okiem na moje pytanie, aby mieć pomysł. Oto [związek] [1] [1]: http://stackoverflow.com/questions/7153521/pass-multi-dimensional-array-from-managed-code-to-unmanaged-code –
Dlaczego nie użyjesz 'ciągu' dla typów dwóch parametrów w C#? – Ove
Uwierz mi, że dużo szukałem ... :). Próbowałem również z ciągami, ale ze względu na unikanie problemów C# testowałem również ze starym dobrym C++ i nadal przepełnienie stosu! – Joao