将指向包含向量的对象传递给dll函数

时间:2012-07-19 19:47:47

标签: c++ object dll vector

我有一个想法是创建一个可配置的报告打印对话框,例如我在其上创建了一个列表框,读取了在数据库中注册的可用报告。然后,用户只需单击列表框中的一个项目,单击打印(为了这个问题,我们省略任何报告参数)。添加任何新报告都可以像在数据库中注册新的dll一样简单。所有报告dll都有一个通常命名的PrintReport函数。

此外,对于编写这些dll的程序员来说,打印应该很容易。他被赋予了一个指向他可以用于gdiplus绘图的对象的指针。

这就是我所做的:

  • 创建了所述对话框
  • 创建了一个命名空间(PRINTOUT)和其中的一些类(其中一个是Print,它包含完全初始化的Gdiplus :: Graphics对象和一个指向用于打印预览的元文件的指针)
  • 在dll中创建了这个通用函数,声明为:

    extern "C" __declspec(dllexport) int PrintReport(PRINTOUT::Print *prn, LONG_PTR ReportData);
    
  • 然后我创建了一个对象并按以下方式调用了dll库:

    typedef BOOL (*tFUNC)(PRINTOUT::Print *, LONG_PTR);
    tFUNC fFUNC=reinterpret_cast<tFUNC>(GetProcAddress(LibInst, "PrintReport"));
    //as a pointer, because i will delete it before unloading a dll. Dll loading code omitted.
    PRINTOUT::Print *prn=new PRINTOUT::Print();
    //this should print using gdiplus object pointer contained in the prn
    //after printing this function just exits
    fFUNC(prn, RpData);
    //cleanup within destructor
    delete prn;
    FreeLibrary(LibInst);
    

问题: dll中的函数与 prn 对象中包含的向量的地址完全不同,我不明白为什么。实际上早些时候我试图宣布PRINTOUT :: Print prn并通过引用传递fFUNC(&amp; prn,RpData),但几乎没有差别。请尝试向我解释为什么会发生这种情况。 prn 对象的地址是相同的,但它的内部地址是不同的。

此致 Kitet

0 个答案:

没有答案