将结构体传递给动态链接库

4

我想向Dll函数传递多个数据,所以考虑创建一个结构体并通过以下方式将它们传递给Dll函数:

struct options
{
int op1,
int op2,
int op3,
char * op4,
...
char * op10
}

 void dllFunction(options myOptions)

作为dll应该在Windows平台上实现,无论使用的是什么开发工具,我想知道:
是否可以用这种方式发送数据?请注意,结构成员都是基本的c类型(int,float,double等)。
为什么我会担心这个问题?如你所知,不同的编译器对std类的实现不同,因此不能在dll边界上传递std类,但我不确定所有编译器是否以相同的方式放置结构成员。如果它们没有,那么代码可能无法与一些编译器一起使用。
结构体是一种简单的c类型数据类型吗?
如果我不能使用结构体来传递大量数据到dll函数内部,最好的方法是什么?

这可以向您展示有关C#的内容。 - LPs
1个回答

3
C ABI已经定义得非常清晰和稳定,因此这个方法工作得很好。如果您在编译时使用了C ++,为了确保您获得C ABI,您需要使用"extern"C"来注释。
唯一的问题是指向内存的指针。由于应用程序和DLL使用的运行时库不兼容的保证,分配内存的代码必须始终是释放它的代码。例如,您不能让应用程序malloc缓冲区,将该缓冲区的指针传递给DLL,然后期望DLL释放缓冲区。要么应用程序需要释放缓冲区(因为它调用了malloc),要么应用程序将需要导出一个MyFree函数供DLL调用以释放内存。

谢谢,我需要用extern c注释结构体吗?如果我不这样做会发生什么?在这方面,C++的标准与C有所不同吗? - mans
DLL编译器和应用程序编译器的打包设置会影响这个吗? - mans

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