Xin chào Tôi có một DLL có hàm mà tôi cần gọi. Chữ ký là:Gọi một dll c từ C++, C# và ruby
const char* callMethod(const char* key, const char* inParams);
Nếu tôi sử dụng ruby tất cả mọi thứ hoạt động tốt:
attach_function :callMethod, [:string, :string], :string
Nếu tôi sử dụng C++ hoặc C# tôi nhận được stack overflow!?
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", "{}");
Tôi đã thử nhiều biến thể để gọi chức năng: WINAPI, PASCAL, stdcall, fastcall, ... không có gì hoạt động.
DLL chưa được tạo bởi tôi và tôi không kiểm soát được.
Có ai có thể giúp tôi với bất kỳ đề xuất nào không !?
Bạn có thể xem câu hỏi của mình để có ý tưởng. Đây là một [link] [1] [1]: http://stackoverflow.com/questions/7153521/pass-multi-dimensional-array-from-managed-code-to-unmanaged-code –
Tại sao bạn không sử dụng 'chuỗi' cho các loại của hai tham số trong C#? – Ove
Hãy tin tôi là tôi đã tìm kiếm rất nhiều ... :). Tôi cũng đã thử với dây nhưng để tránh C# vấn đề tôi cũng đã thử nghiệm với cũ tốt c + + và vẫn tràn ngăn xếp! – Joao