2

我有一个C++文件,其中包含一些我在 C# 中调用的导出函数。其中一个功能是:

char segexpc[MAX_SEG_LEN];

extern "C" QUERYSEGMENTATION_API char* fnsegc2Exported()
{
    return segexpc2;
}

在程序的某个地方,我也在做这件事:

if(cr1==1)
{
strcpy(segexpc, seg);
}

在我的C#程序中,我通过以下方式调用上述内容:

[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern StringBuilder fnsegcExported();

this.stringbuildervar = fnsegcExported();

以前,我没有收到任何错误,但现在我在 Visual Studio 中调试时突然开始收到此错误。

Windows has triggered a breakpoint in SampleAppGUI.exe.
This may be due to a corruption of the heap, which indicates a bug in SampleAppGUI.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while SampleAppGUI.exe has focus.

此错误仅在必须显示窗口之前出现在最后。我没有按任何 F12 键,也没有在此处设置任何断点,但我不确定为什么此时会发生错误并中断。 this.stringbuildervar = fnsegcExported();
当我按下继续时,会出现带有正确输出的窗口。

4

2 回答 2

1

如果您将外部声明从

[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern StringBuilder fnsegcExported();

[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern string fnsegcExported();

然后通过以下方式调用它:

this.stringbuildervar = new StringBuilder(fnsegcExported());

string似乎更合适的类型。或者更好的是使用Marshal该类将您的非托管 char* 返回编组为托管字符串。

[DllImport("QuerySegmentation.dll", EntryPoint = "fnsegcExported", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
public static extern IntPtr fnsegcExported();

string managedStr = Marshal.PtrToStringAnsi(fnsegcExported);
this.stringbuildervar = new StringBuilder(managedStr);
于 2012-05-03T14:42:05.263 回答
0

您在这一行看到错误的原因是它是您拥有调试信息的最后一个堆栈帧。

幸运的是,就您而言,C++ 端的代码很少。确保它segexpc包含一个以零结尾的字符串。

我怀疑因为字符串生成器的默认容量是 16,所以您可能无法以这种方式返回更长的字符串。也许您只想返回字符串。

我还想知道您的 C++ 字符串是否必须是非 Unicode。这将损害每次转换时的性能。

于 2012-05-03T13:16:36.863 回答