我必须调用一个使用某些非标准类型的外部库,因此我在这个外部库中创建了一个C ++包装器。为了节省一些痛苦,我将参数设置为wchar_t *:
void StartBatchJob(wchar_t* server, unsigned short port, int timeout, wchar_t* xml, int length);
当我调用该函数时:
var xml = new StringBuilder("... xml string removed for brevity");
StartBatchJob(((Char*)hostCharPointer), 6015, 60000, ((Char*)Marshal.StringToHGlobalUni(xml.ToString())), xml.ToString().Length);
然而,当函数被调用时,它似乎被截止为256个字符。当我在C ++代码中调试/观察xml参数时,我看到它的截止值为256个字符。
现在,我在很长一段时间内没有在.NET中进行任何C ++或本机代码调用,所以我忘记了它的所有细节。我不认为这是Marshal.StringTo ...调用的问题,因为它似乎返回一个完全呈现的char *。它似乎是运行时尝试传递参数的时候。
更新
根据请求,这是StartBatchJob方法的实现:
extern "C" ZCHAR * JDEWINAPI jdeXMLRequest(const JCHAR *szHostName, unsigned short usPort, const int nNetTimeout, void *xml, int size);
void JDEService::StartBatchJob(wchar_t* server, unsigned short port, int timeout, wchar_t* xml, int length)
{
ZCHAR* presp = jdeXMLRequest(reinterpret_cast<JCHAR *>(server), port, timeout, xml, length);
}
非常感谢任何帮助!
由于