繁体   English   中英

从C ++,C#和ruby调用c dll

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM