我有兴趣从另一个Windows GUI程序(自然地用Delphi编写)中调用SoX,一个开源控制台应用程序.我不想处理抓取和隐藏控制台窗口,而是将应用程序转换为可以从我的应用程序调用的DLL.
在我开始这条道路之前,我很好奇我应该期待多少工作?我们是在谈论一项重大事业,还是有直接的解决方案?我知道一些C,但绝不是专家.
我不期待SoX的具体细节,只是EXE控制台应用程序一般转换为DLL.如果有人熟悉SoX,那就更好了.
有关通过修改C源代码将控制台可执行文件转换为库的特定主题,它取决于命令行应用程序的分解方式.如果以这样的方式编写I/O通过一小组函数或更好的函数指针进行汇总,那么显然它将是微不足道的.
If it's all done with printf, scanf and friends, then you'll probably be best off by finding/creating an include file that all the source files include and adding a macro that redirects printf/scanf and friends to your own functions that are written so as to be amenable to DLL implementation. Things like printf can be built from vsnprintf (use the n-version for safety), so you don't need to reimplement the whole C RTL I/O subsystem. However, there is no vsscanf, but there are third-party implementations on the web.
如果代码使用fprintf,fscanf等来启用文件和控制台之间的间接,那么你仍然没有运气.FILE结构是不透明的,与Pascal文本文件不同,无法实现可移植文本文件驱动程序.如果您使用特定的C RTL进行插入可能仍然可能,但最好建议您沿着宏路由并重新实现自己重命名的FILE类型.
最后,在Delphi中可以使用"popen()"方法,并且在Delphi 2009中使用TTextReader和TTextWriter类更容易.将这些与TFileStream包裹在管道中,并在新进程和STARTF_USESTDHANDLES等中为标准输入,标准输出和标准错误指定管道,它将起作用.如果您不想自己编写,也可以在网上为Delphi提供第三方等效/样本.这是一个.
在Windows中,您只需使用SoX命令行调用CreateProcess.我不知道Win32的Delphi绑定,但我在Win32和C#中都做了这个.
现在您知道CreateProcess是您想要调用的内容,谷歌搜索如何从Delphi中执行此操作应该为您提供所需的所有代码.
Delphi Corner Article - 使用CreateProcess执行程序
以简单的方式调用CreateProcess()