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