Excel VBA AllocConsole:在控制台中select的文本之后,Dll例程冻结

我的应用程序有一个Excel前端。 我正在使用VBA来调用我的C / C ++ DLL,它完成所有的数字处理。 VBA用于在Excel和我的C ++ dll之间传递数据,并生成图表等。

在我的C ++ DLL中,我使用AllocConsole()函数来显示一个控制台窗口,在其中显示状态更新和结果。

每当我在控制台窗口中select(使用鼠标)一些显示的文本时, 从Excel VBA调用的任何C ++ dll函数(select后)冻结,我的应用程序变得无法响应。

我无法解决这个问题。 我不知道控制台窗口中的select对我的应用程序造成什么影响。

任何想法如何解决这个问题?

在没有看到代码的情况下,很难找出这种行为的原因,但有一个解决方法,您可以在代码中使用它。

如果您有权访问DLL的源代码,而不是将输出提供给控制台,请将输出放入BSTR结构 (VBA用作string)。

“接收”一个VBAstring的详细信息在这里: http : //msdn.microsoft.com/en-us/library/aa263531(v=vs.60).aspx

您可以修改该代码以写入string以返回到VBA。

这样,您将能够使用VBAstring并将其以VBA UserForm的forms放到您自己的控制台中。

所有用这种方法的用户界面都将被Excel应用程序所控制,并且只会调用数字部分的DLL。 这应该照顾冻结

如果你不想使用string,你可以传递一个任意大小的字节数组指针到C ++,其中它将结果作为一个字符数组(VBA的byte与C ++的char数据types相同)。 这样,你可以

  1. 将一个“空”字节数组传递给C ++,这个C ++“足够用于你的目的”
  2. 使用字节数组的第一个元素(通过引用传递),C ++可以填充控制台输出并将控制权返回给VBA
  3. 然后可以使用VBA修剪/重新格式化输出,并将其作为具有大型TextBox窗体呈现在控制台窗口中