1

我有一个想法来创建一个可以配置的报表打印对话框,例如,我在上面创建了一个列表框,读取在数据库中注册的可用报表。然后,用户只需单击列表框中的一项,单击打印(为了这个问题,我们省略任何报告参数)。添加任何新报告就像在数据库中注册一个新的 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(&prn, RpData) 但几乎没有区别。请尝试向我解释为什么会发生这种情况。prn对象的地址相同,但其内脏的地址不同。

问候风筝

4

0 回答 0