gpt4 book ai didi

c# - 从 C# 将 Bool 数组传递给 C++ 代码

转载 作者:行者123 更新时间:2023-11-30 03:51:14 28 4
gpt4 key购买 nike

我目前正在与其他一些人一起从事一个项目,遗憾的是他们不再提供引用资料。该项目使用 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 是一个 bool 值数组,用于根据用户输入确定是否应同步某些文件。

C++ 应该接受这个数组,并且能够在满足某些条件时将一些 bool 值翻转为真或假。

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++ 代码完成时,仍然有应该设置为 false 的 True 标记。如果我通过 ref 发送它,则会出现堆栈溢出。没有 ref,数组似乎没有改变。

编辑:这是被要求的。

SYNC_API Int32 Synch(void * voidPtr, const TCHAR * databaseDir, const TCHAR * truckDir, bool wholeFiles[])

Edit2:在 C++ 代码中,我有一个循环遍历数组并在 wholeFiles 数组中每行每个位置输出一次 true/false 的日志语句,我最终得到了适当的日志输出,但是当我看在 C# 代码上的 Array 完成后,它没有改变。

最佳答案

如果您的 DllImport 下方的注释是 C++ 端的确切函数声明,那么您的 wholeFiles 数组将永远不会在 C++ 端看到,因为它不期望第五个论点。确保首先解决该问题。

在 C# 中,bool 只有一种大小,即 1 个字节。在 C++ 中有两种类型,C 风格的 1 字节 bool 和 Win32 4 字节 BOOLBy default P/Invoke will marshal bools as BOOL.

因此,如果第一位不是你的全部问题并且它不起作用,那么你正在使用 C 风格的 bool 并且需要用 [MarshalAs] 告诉 C#像这样:

[DllImport("Synch.DLL", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
static extern Int32 Synch(
IntPtr pSync,
string databaseDir,
string destDir,
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.I1)]
bool[] wholeFiles);

您也不需要 ref,因为数组本身就是一种引用类型。 ref 数组只有在您调用的函数想要与另一个数组交换数组时才有用。

另请注意,您不必将其设为多行,如果函数全部在一行中,该属性将起作用,我这样做只是为了提高可读性。

关于c# - 从 C# 将 Bool 数组传递给 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31410324/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com