跨DLL边界传递指针对象

      因为需要写一些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对象呢?为什么要这样实现,期待更多的人来讨论这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值