dll与exe之间怎么共享数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dll与exe之间怎么共享数据相关的知识,希望对你有一定的参考价值。
共享数据段的方式我已经试过了,没有用
如下:
#pragma data_seg("Shared")
CString g_sPath="";
#pragma data_seg()
#pragma comment(linker,"/Section:Shared ,rws")
语法没问题
不同进程加载该dll以后,发现并不共享g_sPath,即一个实例修改该变量,在另一个实例中没有修改。
另外,文件映射的方式就不用说了,这个太麻烦,我只需要共享一个很简单的变量,希望给点帮助
在DLL中:
_declspec(dllexport) float fPointX;
...........
在EXE中:
_declspec(dllimport) float fPointX;
不过此种方法有一个缺陷,只能在一个EXE和一个DLL中导入数据,而不能在一个EXE和多个DLL中共享数据。遇到后一种情况的时候:如果你仍然需要传输数据,可以在每个DLL中定义一个函数来传递数据。例如:CMyClass (在DLL中定义的类,用扩展型MFC动态链接类型)
Class CMyClass
............
public:
float GetPointX();
void GetPointX(float *p_PointX);
;
在EXE中:
CMyClass MyClass;
MyClass.GetPointX();
或者:
float fX;
MyClass.GetPointX(&fX);
注:后一种方法对所有情况都适用。祝好运! 参考技术B 两位编程高手!
在EXE / DLL之间传递数据
我有DLL和EXE应用程序。 DLL在EXE中注册。然后在EXE实例中,类A
被创建为shared_ptr
。接下来,将此实例传递给DLL,并在DLL端调用此实例的方法example
。
class Result
{
//Some attributes e.g std::vector
}
class A
{
public:
A(){}
~A(){}
Result example(){
Result r;
//Fill data in r object....
return r;
}
}
问题是当在DLL中的某处调用example
时:
void someDLLMethod()
{
//a is a shared pointer of A class
{
Result r = a->example();
}//PROBLEM IS HERE DURING DEALLOCATING Result OBJECT
//some stuff...
}
似乎在删除r
对象期间出现问题。我知道什么时候我会尝试在EXE中分配一些内存然后尝试在DLL中释放这个内存然后可能发生内存问题,但在这种情况下,Result
对象从EXE复制到DLL。此外,存储在Result
对象中的向量不包含任何指针,因此它应该是向量的深层副本。一种解决方案是在DLL中分配Result
对象,将其作为对被调用方法的引用传递并填充所有必要的数据,但我希望得到副本作为结果。为什么会出现此问题?如何修复它? EXE和DLL在Visual Studio的相同解决方案中,必须使用 MT或 MTd编译,并且不可能更改它。
向量的内存正在DLL中分配并在exe中释放,因为向量可能在其返回(或甚至只是RVO)中使用移动语义,它只是将指针移动到已分配的内部。当你使用静态CRT时,这意味着内存被分配了一个crt并且使用不同的实例自由,这导致了不良。
短篇小说 - 不要这样做。跨DLL边界公开C ++对象是不好的。您应该使用C接口或为此设计的接口 - 例如WinRT的。
如果确实选择在DLL接口上公开c ++对象,则必须确保EXE和DLL都使用相同版本的编译器并与/ MD链接。如果你不能使用/ MD,你永远不会让它可靠地工作。
当然你可以预先分配矢量并将其填入调用中,但这只是掩盖了问题,直到事情不可避免地改变了。
以上是关于dll与exe之间怎么共享数据的主要内容,如果未能解决你的问题,请参考以下文章