跨DLL边界传递指针对象
来源:互联网 发布:平安证券官方软件 编辑:程序博客网 时间:2024/05/16 10:04
因为需要写一些DLL,且DLL编译选择/MT方式,DLL会导出函数,函数中会返回指针。
如下所示:(示例仅供参考,呵呵)
int * WINAPI Export()
{
return new int;
}
现在我的EXE中会使用这个函数,代码如下:(如何获取函数地址的方法我就不赘述)
int *p = Export();
然后我在使用完后我直接在EXE中调用 delete p,此时会发生异常,报访问异常。后来想了一下,这个异常有一些道理,因为不是EXE中申请的内存。所以,我又在上面的DLL中导出了一个函数,如下所示:
void WINAPI Destory(int *p)
{
delete p;
}
然后在EXE中调用此函数,但程序依旧发生异常,报访问异常,着实想不通。后来查了一通资料,在http://msdn.microsoft.com/en-us/library/ms235460.aspx中看出了一些端倪,然后使用/MD编译DLL和EXE,一切正常,说明程序没有任何问题,是由/MT编译带来的问题。
后来想到使用VirtualAlloc这个函数来分配内存,同时使用VirtualFree来释放内存,经过测试,使用/MT编译DLL和EXE一切正常。
说到这里,肯定会有人,那对于自定义类型(即类)如何做呢?也即我导出的是一个对象指针,不是一个内置的对象指针,如何做呢?
我目前试了一下,代码如下:
class KWhat
{
public:
KWhat(){}
BOOLinit()
{
m_iWhat= 0;
returnTRUE;
}
private:
intm_iWhat;
};
extern "C" __declspec(dllexport) int *GetPointer()
{
PVOIDpv = VirtualAlloc(NULL,1024,MEM_COMMIT,PAGE_READWRITE);
KWhataa;
memcpy(pv,&aa,sizeofaa);
((KWhat*)pv)->init();
return(int*)pv;
}
extern "C" __declspec (dllexport) void Destory(int *p)
{
VirtualFree((void*)p,1024,PAGE_READWRITE);
}
EXE中调用这二个方法,没有问题。至此,跨DLL边界传递指针对象算是找到一个变通的方法实现,但不知道是否还有其他方法来实现。
为什么有多份CRT库的拷贝时,就不能直接delete对象呢?为什么要这样实现,期待更多的人来讨论这个问题。
- 跨DLL边界传递指针对象
- 跨越DLL边界传递CRT对象潜在的错误
- 通过DLL导出类指针来传递及使用对象
- 在DLL间或者DLL与EXE之间传递vector对象或指针的问题
- sizeof的用法,边界对齐,指针参数传递,union
- 多个DLL(exe)之间通过指针或者引用传递STL对象
- 跨AppDomain边界访问对象
- VB中如何传递指针给DLL
- C# 调用Dll 传递字符串指针参数
- C# 调用Dll 传递字符串指针参数
- C# 调用Dll 传递字符串指针参数
- 关于跨线程传递MFC对象指针的探究
- [转载]有关DLL中New和外部Delete以以及跨DLL传递对象的若干问题
- 有关DLL中New和外部Delete以以及跨DLL传递对象的若干问题
- DLL中New和外部Delete以及跨DLL传递对象的问题
- [转载]有关DLL中New和外部Delete以以及跨DLL传递对象的若干问题
- DLL为啥要使用MD模式--运行时对象越过DLL边界的潜在错误
- 向ATL DLL中传递C++对象
- 使用Gflags来检测heap问题
- JAVA实现二分法查找并输出每一趟查找的结果
- 程序员100题(15)-求二元查找树的镜像
- Tomcat线程池配置
- 关于handle_level_irq、handle_edge_irq和中断嵌套问题
- 跨DLL边界传递指针对象
- 11.17开发随记
- Loadrunner 结果分析--
- 面向对象------实例讲解:类设计分析
- ps基础教程
- gpio_request()函数
- vmm_ENV
- Java FCKeditor2.6的使用
- 哈希链表 操作大全 实现