1

我必须调用一个使用一些非标准类型的外部库,所以我围绕这个外部库创建了一个 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);

}

任何帮助是极大的赞赏!

谢谢

4

0 回答 0