4

我有兴趣从另一个 Windows GUI 程序(自然用 Delphi 编写)调用开源控制台应用程序SoX 。我不想处理抓取和隐藏控制台窗口,我只想将应用程序转换为我可以从我的应用程序调用的 DLL。

在我开始走这条路之前,我很好奇我应该做多少工作?我们是在谈论一项重大事业,还是有直接的解决方案?我知道一些 C,但绝不是专家。

我不期待 SoX 的具体细节,一般只是将 EXE 控制台应用程序转换为 DLL。如果有人熟悉 SoX,那就更好了。

4

7 回答 7

6

对于通过修改 C 源代码将控制台可执行文件转换为库的特定主题,这取决于命令行应用程序的分解方式。如果它是以这样一种方式编写的,即通过一小组函数甚至更好的函数指针来汇集 I/O,那么显然它将是微不足道的。

如果这一切都是用 printf、scanf 和朋友完成的,那么最好的办法是找到/创建一个包含所有源文件的包含文件,并添加一个将 printf/scanf 和朋友重定向到您自己编写的函数的宏以便适合 DLL 实现。可以从 vsnprintf 构建诸如 printf 之类的东西(使用 n 版本以确保安全),因此您无需重新实现整个 C RTL I/O 子系统。不过没有vsscanf,但是网上有第三方实现。

如果代码使用 fprintf、fscanf 等来启用文件和控制台之间的间接连接,那么您仍然不走运。FILE 结构是不透明的,与 Pascal 文本文件不同,不能实现可移植的文本文件驱动程序。如果您深入研究特定的 C RTL,它可能仍然是可能的,但最好建议您沿着宏路线走并重新实现您自己重命名的 FILE 类型。

最后,“popen()”方法在 Delphi 中是可能的,并且在 Delphi 2009 中使用 TTextReader 和 TTextWriter 类变得更加容易。将这些与包裹在管道上的TFileStream结合起来,在新进程和STARTF_USESTDHANDLES等中指定标准输入、标准输出和标准错误的管道,就可以工作了。如果您不想自己编写,也可以在网络上为 Delphi 提供第三方等价物/示例。这是一个。

于 2008-09-25T03:43:29.353 回答
5

在 Windows 中,您只需使用 SoX 命令行调用CreateProcess 。我不知道 Win32 的 Delphi 绑定,但我在 Win32 和 C# 中都做过这件事。

现在您知道 CreateProcess 是您想要调用的,谷歌搜索如何从 Delphi 执行此操作应该会为您提供所需的所有代码。

Delphi 角文章 - 使用 CreateProcess 执行程序

调用 CreateProcess() 的简单方法

于 2008-09-25T02:51:23.673 回答
4

您甚至可能不需要 DLL,您可以使用popen()函数来运行控制台应用程序并收集任何输出文本。

于 2008-09-25T02:49:21.543 回答
4

按照 Indiv 建议的方式运行该过程,并像 Adam 所展示的那样捕获输出。

但是,如果您仍想进行 DLL 转换,这将帮助您开始

  1. 为windows配置SOX并编译
  2. 使用 C++ 工具创建一个空的 DLL 项目
  3. 添加 SOX 文件作为项目的一部分
  4. 添加一个名为 DLLMain 的新函数

    BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID ) {return TRUE;}

  5. 添加列出 DLL 中导出的 .DEF 文件(使用项目名称作为文件名) - 向其中添加以下内容

    LIBRARY      "name.DLL" 
    

    出口

    CallOldMain 私人

  6. 将 SOX 的 main 重命名为 CallOldMain

  7. 编写一个 CUSTOM 函数来记录输出/返回错误等。

  8. 在 SOX 应用程序中找到所有 printfs / cout 并将其替换为对上面自定义函数的调用

  9. 编译 DLL 后,您现在可以使用 C 主程序期望的相同参数调用函数 CallOldMain。您可以修改此签名以从上面返回错误/输出。

于 2008-09-25T03:48:33.397 回答
3

免责声明:我对 SoX 一无所知。可能是代码的结构使这变得容易,或者可能更难。无论哪种方式,过程都是相同的:

首先,您要在 SoX 应用程序中找到要调用的函数。控制台应用程序很可能具有解析命令行并调用适当函数的代码。所以首先,找到你想要使用的功能。

接下来,在此站点上查看有关从 C 中导出 DLL 中的函数的信息:创建和使用 DLL

然后创建一个新的 makefile 或 Visual Studio 项目文件,目标是 DLL,并添加您已修改以导出的 SoX 程序中的源文件。

于 2008-09-25T03:01:36.163 回答
1

你没有提到你的工具链是什么,但是如果你在 Windows 中配置 gcc,你可以使用普通的 config;make;make install 来编译 sox。在此过程中,它将创建一个 dll 文件和控制台应用程序。或者,您可以只指定生成目标以仅生成 dll。这将编译一个仅依赖于 MS C 运行时 dll 的 windows 本机库,您可以在自己的应用程序中使用它。

于 2008-09-25T05:00:07.983 回答
1

您可以执行控制台应用程序并使用管道捕获其输出。您将管道的 une 一侧用作 CreateProcess 的标准输出,然后像普通文件一样从另一侧读取。

您可以在此处查看用 delphi 编写的工作示例:http: //delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

于 2008-09-25T08:47:45.567 回答