将C语言控制台程序转换为动态链接库

4
我对从另一个Windows GUI程序(自然地使用Delphi编写)调用开源控制台应用程序SoX感兴趣。我想将该应用程序转换为DLL,以便从我的应用程序中调用,而不必处理爬取和隐藏控制台窗口的问题。
在开始这个过程之前,我想知道要做多少工作?我们是在谈论一个重大的任务,还是有一种简单直接的解决方案?我懂一些C语言,但并不是专家。
我不需要关于SoX的具体细节,只需了解EXE控制台应用程序转换为DLL的一般情况。如果有人熟悉SoX,那就更好了。
7个回答

6
关于将控制台可执行文件转换为库文件的具体主题,取决于命令行应用程序的结构。如果它是以一种 I/O 通过一小组函数或者更好的函数指针来处理的方式编写的,那么显然这将是微不足道的。

如果所有内容都是使用 printf、scanf 和其它类似函数完成的,那么你最好是找到/创建一个包含文件,让所有源文件都包含它,并添加一个宏,将 printf/scanf 等重定向到你自己编写的函数,使其适合 DLL 实现。像 printf 这样的东西可以从 vsnprintf 中构建(出于安全考虑,请使用 n 版本),因此你不需要重新实现整个 C RTL I/O 子系统。但是,没有 vsscanf,但是网上有第三方实现。

如果代码使用 fprintf、fscanf 等来在文件和控制台之间进行间接操作,那么你还是没有办法。FILE 结构是不透明的,并且与 Pascal 文本文件不同,不能实现便携式文本文件驱动程序。如果你深入研究特定的 C RTL,可能仍然有可能,但是最好选择宏路线并重新实现您自己的重命名 FILE 类型。

最后,"popen()" 方法在 Delphi 中是可行的,并且在 Delphi 2009 中使用 TTextReader 和 TTextWriter 类会更容易。将这些与围绕管道的 TFileStream 结合起来,并在新进程中指定标准输入、标准输出和标准错误的管道以及 STARTF_USESTDHANDLES 等,它就能正常工作了。如果你不想编写自己的代码,网上也有第三方等效/示例可供 Delphi 使用。这里有一个。


5

4

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


调用程序是用Delphi编写的。Delphi没有popen()函数。 - Barry Kelly
Delphi可以与Windows API通信,它可以实现类似的功能。 - Thomas

4

按照Indiv的建议运行进程,并像Adam所示一样捕获输出。

然而,如果您仍然想进行DLL转换,以下内容可以帮助您入门。

  1. Configure SOX for windows and compile it
  2. Create an empty DLL project using your C++ tool
  3. Add the SOX files to be part of the project
  4. Add a new Function called DLLMain

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

  5. Add a .DEF file (use the project name as the file name) that lists the exports in the DLL - Add the following content to it

    LIBRARY      "name.DLL" 
    

    EXPORTS

    CallOldMain PRIVATE

  6. Rename the main of SOX as CallOldMain

  7. Write a CUSTOM function to log the output / return error etc.

  8. Find all printfs / cout in the SOX application and replace it with calls to your custom function above

  9. Once the DLL is compiled you can now call the function CallOldMain with the same parameters main programs of C expects. You could modify this signature to return the errors / output from above.


3
免责声明:本人对SoX一无所知。也许代码结构已经使这个过程变得简单,或者更加困难。不管怎样,流程都是相同的:
首先找到你要调用的SoX应用程序中的函数。很可能控制台应用程序具有解析命令行并调用适当函数的代码。因此,首先要找到要使用的函数。
接下来,请参阅此站点上关于从C导出DLL的函数信息:创建和使用DLL 然后,创建一个新的makefile或Visual Studio项目文件,目标为DLL,并添加已修改为导出的SoX程序的源文件。

1

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


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接