【发布时间】:2015-07-14 15:02:49
【问题描述】:
我目前正在与其他几个人一起开展一个项目,遗憾的是,他们不再提供参考资料。该项目使用 C# 作为 GUI,使用 C++ 更新我们的古老数据库。目前,我在 C# 中有这个功能:
[DllImport("Synch.DLL", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
//Synch bool Synch(void * voidPtr, const TCHAR * databaseDir, const TCHAR * truckDir)
static extern Int32 Synch(IntPtr pSync, string databaseDir, string destDir, ref bool[] wholeFiles);
wholeFiles 是一个布尔数组,用于根据用户输入确定是否应同步某些文件。
C++ 应该接受这个数组,并且能够在满足某些条件时将一些布尔值翻转为真或假。
if (numSyncRecords > 0){
Log::WriteVerbose(_T(" %d recs, %d differences found"), (int) numRecsUsed, (int) numSynRecords);
if(wholeFiles[sourceFileID]){
CString tempPath = _T("");
tempPath += destDir;
tempPath += fileName;
DeleteFile(tempPath);
}
else
wholeFiles[sourceFileID] = false;
}
else
wholeFiles[sourceFileID] = false;
在上面的例子中,我传入Trues,如果文件没有变化,设置为false,避免处理不需要的文件。
现在,我的问题是,当 C++ 代码完成后,仍然有 True 标记应该设置为 false。如果我通过 ref 发送它,那么我会得到堆栈溢出。没有 ref,数组似乎没有变化。
编辑:这是请求的。
SYNC_API Int32 Synch(void * voidPtr, const TCHAR * databaseDir, const TCHAR * truckDir, bool wholeFiles[])
Edit2:在 C++ 代码中,我有一个日志语句,它遍历数组并在整个文件数组中的每个位置每行输出一次真/假,我最终得到了适当的日志输出,但是当我查看完成后在C#代码上的Array处,不变。
【问题讨论】:
-
你不想使用
ref-wholeFiles是一个数组,它已经通过引用传递了。您可以将ref用于TCHAR **,即返回一个不同的 数组。您可能想在参数上使用[In, Out]属性,将其视为输入/输出,但我认为这不会有帮助。但是,您对 C 声明的评论不符合 P/Invoke - 签名是否更改,还是错误?您正在传递destDir字符串,而不是现在看起来的wholeFiles数组。如果签名发生变化,请贴出头文件的相关部分。 -
我忘记更新评论了,很抱歉。