[英]Calling a c dll from C++, C# and ruby
嗨,我有一个DLL,我需要调用一个函数。 签名是:
const char* callMethod(const char* key, const char* inParams);
如果我使用ruby一切正常:
attach_function :callMethod, [:string, :string], :string
如果我使用C ++或C#,我会得到堆栈溢出 !
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", "{}");
我尝试了很多函数调用的变体:WINAPI,PASCAL,stdcall,fastcall,......没什么用。
DLL并非由我制作,我无法控制它。
谁能帮我提出任何建议!?
确保标题中的声明包含在extern“C”块中:
extern "C" {
const char* callMethod(const char* key, const char* inParams);
}
请参阅http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html#faq-32.3
这只是一个想法,但AFAIK这可能是一个以null结尾的字符串的问题, const char* myvar
是以null结尾的,但是字节数组不是。 你需要做的就是将调用更改为...(String a, String b)
并将它们编组为LPStr
。
我认为没有理由不改变你的电话
[DllImport(“DeviceHub.dll”,CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern string callMethod(
字符串键,
字符串inParams
);
您需要向函数发送指针,而不是实际值/字节。
在为本机函数调用生成类型转换时,我总是使用此映射 。
同样适用于c ++代码,您需要使用内容创建变量并调用该函数。
Stack Overflow Exception是微软语言中的一个错误,用于防止无限递归,并防止不兼容的程序相互交互。 如果您的dll方法使用递归,请尝试使用迭代重写它。 否则,像Ove所说,并尝试使用字符串。 如果它仍然无法正常工作,Google会出现兼容类型。 在不知道实际方法的情况下,我可以说这一切。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.