Excel VBA AllocConsole:在控制台中选择文本后,Dll例程冻结



我的应用程序有一个Excel前端。我使用VBA来调用我的C/c++ dll,它可以处理所有的数字。VBA用于Excel和我的c++ dll之间的数据通信,并生成绘图等。

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

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

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

对如何解决这个问题有什么想法吗?

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

如果您可以访问DLL的源代码,而不是将输出放入控制台,将输出放入BSTR结构 (VBA将其作为字符串使用)。

关于'接收' VBA字符串的详细信息在这里:http://msdn.microsoft.com/en-us/library/aa263531(v=vs.60).aspx

您可以修改该代码,将其写入字符串以返回VBA。

这样,您将能够使用VBA字符串,并将其以VBA UserForm的形式输出到您自己的控制台。

使用这种方法的所有UI将由Excel应用程序控制,并且DLL将仅为数字部分调用。这应该能解决冰冻

如果你不喜欢使用字符串,你可以传递一个任意大小的字节数组的指针给c++,其中它把结果作为一个字符数组(VBA的byte是相同的大小作为c++的char数据类型)。这样,你就可以

  1. 向c++传递一个'空'字节数组,该数组"足够长"
  2. 使用字节数组的第一个元素,通过引用传递,c++可以填充控制台输出并将控制返回给VBAVBA可以用来修剪/重新格式化输出,并将其呈现在控制台窗口作为Userform与大TextBox

最新更新