我有一个VS2005解决方案项目,它由两个依赖项目组成。该项目是一个C控制台应用程序,它与设备通信并从中获取一些输出。这个项目是一个旧项目,它不是我写的。我是一名电气电子工程师,大多数时候我都使用C语言进行项目。我不太了解C ++和C#。有一段时间我正在处理VS2010和c ++表单应用程序。我得到了基础知识,但我遇到了一些问题。我想为这个控制台项目添加gui。我为此设计了一个表格应用程序。我有按钮来启动控制台应用程序和RichTextbox输出。
我必须通过单击按钮从winform应用程序调用控制台项目中的函数。我想在循环中调用该函数以进行连续读数。
我试图调用“console.exe”文件并在我的winform项目中运行它并将输出重定向到richtextbox,但对我的项目来说太慢了。我必须从我的设备上连续快速地阅读。
最好的方法是什么?我想将我的C控制台应用程序转换为Windows窗体应用程序。
谢谢。
答案 0 :(得分:1)
您不能直接从另一个EXE调用EXE内的函数。
这里有几个选项,具体取决于您愿意做多少工作以及旧项目的长期目标。
只需将控制台项目中的相关代码复制到表单项目中;如果您的控制台项目已经过时并且您不再计划支持它,那么这种方法效果最佳。
将相关代码从控制台项目移动到库(DLL)项目中,并从控制台和表单应用程序中引用它;如果控制台项目中的代码相对孤立(例如,您没有很多全局变量等),则此方法有效。
在您的控制台项目中添加某种IPC机制(侦听TCP套接字或命名管道等),您可以从表单项目连接到该项目并直接获取数据;这就像你可以达到“从另一个EXE在一个EXE中调用一个函数”的原始目标一样接近,但它的工作要多得多。
答案 1 :(得分:0)
由于C是C ++的一个子集,您应该能够将C源程序中的C源代码编译到C ++项目中,将其用作可以直接从gui调用的库。 Check out this question for how to get started on doing this
你应该能够像以前一样使用C代码,尽管它很可能需要一些调整。 Here's another related stack overflow question.
答案 2 :(得分:0)
通常,您可以将现有逻辑从控制台应用程序移动或转换为类库项目。然后,您将在此表单项目中包含对此类库的引用。接下来在您的表单项目中,您可以从另一个线程调用库方法(例如,当您按下按钮时),以便不阻止您的UI线程。敬请注意!使用结果更新RichTextBox时,您必须调用Invoke方法来执行跨线程操作(有关相关主题,请参阅here)。