9

您好我有一个需要调用的函数的 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 不是我制作的,我无法控制它。

任何人都可以帮我提出任何建议!?

4

4 回答 4

1

这只是一个想法,但 AFAIK 这可能是空终止字符串的问题,const char* myvar是空终止的,但字节数组不是。您需要做的就是将调用更改...(String a, String b)LPStr.

于 2012-05-04T07:49:42.803 回答
1

确保标题中的声明包含在 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

于 2012-05-03T23:55:04.000 回答
0

我看不出你为什么不应该改变你的电话

[DllImport("DeviceHub.dll", CallingConvention = CallingConvention.Cdecl)]
private unsafe static extern string callMethod(
string key,
string inParams
);

您需要向函数发送指针,而不是实际值/字节。在为本地函数调用生成类型转换时,
我总是使用这个映射。
同样适用于 c++ 代码,您需要使用内容创建变量并调用该函数。

于 2012-05-04T08:10:55.427 回答
-5

Stack Overflow Exception 是微软语言中的一个错误,用于防止无限递归,并防止不兼容的程序相互交互。如果您的 dll 方法使用递归,请尝试使用迭代重写它。否则,就照欧维说的做,用字符串试试。如果它仍然不起作用,请谷歌寻找兼容的类型。在不知道实际方法的情况下,我只能这么说。

于 2012-05-03T23:30:04.740 回答