【问题标题】:Convert console exe to dll in C在C中将控制台exe转换为dll
【发布时间】:2008-09-25 02:40:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: c delphi dll exe


    【解决方案1】:

    对于通过修改 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 提供第三方等价物/示例。 Here's one.

    【讨论】:

      【解决方案2】:

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

      既然您知道 CreateProcess 是您想要调用的,那么从 Delphi 中搜索有关如何执行此操作的 Google 搜索应该会为您提供所需的所有代码。

      Delphi Corner Article - Using CreateProcess to Execute Programs

      Calling CreateProcess() the easy way

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 调用程序是用Delphi编写的。 Delphi 没有 popen() 函数。
        • Delphi 可以与 Windows API 对话,但它可以做类似的事情。
        【解决方案4】:

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

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

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

          BOOL APIENTRY DllMain( 处理 hModule, DWORD ul_reason_for_call, LPVOID ) {返回 TRUE;}

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

          LIBRARY      "name.DLL" 
          

          出口

          CallOldMain PRIVATE

        6. 将 SOX 的 main 重命名为 CallOldMain

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

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

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

        【讨论】:

          【解决方案5】:

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

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

          接下来,在此站点上查看有关从 C 中导出 DLL 函数的信息:Creating And Using DLLs

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

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 2014-09-10
                • 1970-01-01
                • 2011-10-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-12-10
                相关资源
                最近更新 更多