我必须调用一个使用一些非标准类型的外部库,所以我围绕这个外部库创建了一个 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);
}
任何帮助是极大的赞赏!
谢谢