Ciao Ho una DLL con una funzione che ho bisogno di chiamare. La firma è:Chiamare una DLL c da C++, C# e ruby
const char* callMethod(const char* key, const char* inParams);
Se uso rubino tutto funziona bene:
attach_function :callMethod, [:string, :string], :string
Se uso C++ o C# ho overflow dello stack!?
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", "{}");
ho provato un sacco di varianti per la funzione di chiamata: WINAPI, PASCAL, stdcall, fastcall, ... niente funziona.
La DLL non è stata creata da me e non ho il controllo su di esso.
Qualcuno può aiutarmi con qualche suggerimento !?
Puoi dare un'occhiata alla mia domanda per avere un'idea. Ecco un [link] [1] [1]: http://stackoverflow.com/questions/7153521/pass-multi-dimensional-array-from-managed-code-to-unmanaged-code –
Perché non usi 'string' per i tipi dei due parametri in C#? – Ove
Credimi, ho cercato molto ... :). Ho anche provato con le stringhe ma, per evitare problemi C#, ho anche provato con un buon vecchio C++ e con stack overflow! – Joao