我有一个想法是创建一个可配置的报告打印对话框,例如我在其上创建了一个列表框,读取了在数据库中注册的可用报告。然后,用户只需单击列表框中的一个项目,单击打印(为了这个问题,我们省略任何报告参数)。添加任何新报告都可以像在数据库中注册新的dll一样简单。所有报告dll都有一个通常命名的PrintReport函数。
此外,对于编写这些dll的程序员来说,打印应该很容易。他被赋予了一个指向他可以用于gdiplus绘图的对象的指针。
这就是我所做的:
在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