我可以从 linux 客户端调用 windows DLL 吗? [复制]

Posted

技术标签:

【中文标题】我可以从 linux 客户端调用 windows DLL 吗? [复制]【英文标题】:Can I call a windows DLL from a linux client? [duplicate] 【发布时间】:2011-08-08 14:55:50 【问题描述】:

我在教程中找到了这个命令行:

gcc -o Client1 Client1.o CodeSample1.dll -lgdi32 -lm

让我想知道什么时候可以从 linux 客户端调用 windows DLL,或者从 windows 客户端调用 Linux .so 文件。是否有语言、名称装饰等限制?

【问题讨论】:

【参考方案1】:

我怀疑你实际上并没有试图问你问了什么。

您示例中的 .dll 文件只是一个共享库。您可以使用 GCC 链接到共享库。唯一的问题是你如何称呼你的图书馆:

// Stage 1: Build and link the library:

gcc -c -o mylib.o mylib.c           // Compile

gcc -shared -o mylib.dll mylib.o    // on Windows
gcc -shared -o libmylib.so mylib.o  // on Linux etc.

命名约定实际上只是一个约定。现在链接您的程序:

// Stage 2: Build and link your application:
gcc -c o main.c main.cpp                           // Compile

gcc -o main main.o mylib.dll -lm -lfoo -lgdi32     // Windows
gcc -o main main.o libmylib.so -lm -lfoo           // Linux
gcc -o main main.o -lmylib -lm -lfoo -L/opt/mylibs // Alternatively

因此,如果代码完全在您手中,您只需先构建库,然后链接到您的项目。

如果你的意思是库源代码不可用并且你只有一个 Windows 二进制文件,那么情况就复杂多了。例如,二进制格式甚至不兼容。

【讨论】:

你一针见血,但我还有一个问题要问你。 DLL 是使用 VB6 编译器创建的。这不是创建 Windows 二进制文件吗?为什么这仍然可以使用 gcc 链接? 在 Windows 下,作为 GCC 一部分的链接器使用 Windows 二进制格式,因此它可以读取任何 Windows DLL(都使用相同的二进制格式)。只要你只是使用 C 函数,你就相对安全,因为 C ABI 非常稳定。如果您尝试使用 C++ 类库进行相同操作,您可能会遇到麻烦。 Linux 下会发生什么?我可以使用 gcc 链接 DLL 吗? 如果 DLL 已经在 Windows 下构建和链接,那么通常“否”,因为您的 Linux 使用不同的二进制格式(通常是 Linux 中的 ELF 和 Windows 中的 PXE)。但是,即使您可以读取二进制格式(原则上这是可能的),只要 DLL 进行任何类型的系统调用或对 OS 函数的引用,您就会被卡住。不过你可以试试winewine-gcc,也许Wine 实现了你的DLL 需要的操作系统特性。 @KerrekSB 假设我们可以在 linux 中读取 dll 二进制格式,您所指的系统调用和操作系统函数是 Windows“内核”的一部分吗?或者换句话说,为什么我们不能从它们对应的dll文件中类似地读取系统和操作系统调用?

以上是关于我可以从 linux 客户端调用 windows DLL 吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 调用从客户端 windows phone 8.0 silverlight 返回对象的方法

如何从服务器端获取 Url Hash (#)

如何从服务器端获取 Url Hash (#)

windows客户端开发--根据可下载url另存为文件(微信windows客户端这样做的)

从 Windows 服务调用时出现 WCF 安全异常

REST 调用和 URL 之间的区别