dev16 cxgrid 在DLL里Form里使用,报0地址错,在EXE里正常。c++builder 的DLL报错,delphi也报错。
First chance exception at $09CE9B44. Exception class $C0000005 with message 'access violation at 0x09ce9b44: read of address 0x00000000'.
procedure TForm1.Button1Click(Sender: TObject);beginself.cxGrid1DBTableView1.CreateColumn;end;
最终指向了 cxGridCustomTableView.pas
function TcxCustomGridTableView.CreateItem: TcxCustomGridTableItem;
begin Result := GetItemClass.Create(Owner); AddItem(Result);//errorend;function TcxCustomGridTableItem.CanFilter(AVisually: Boolean): Boolean;
begin Result := (esoFiltering in GetProperties.GetSupportedOperations) and FOptions.Filtering and (not AVisually or GridView.OptionsCustomize.ItemFiltering and FOptions.FilteringPopup);end;DevExpress VCL\ExpressCore Library\Sources\dxCore.pas
//在这里看到dll的初始化和exe是分开的。exe直接调用,dll在InitializeList里。InitializeList是不是需要手动调用? procedure TdxUnitsLoader.AddUnit(const AInitializeProc, AFinalizeProc: Pointer);var AProc: TdxProc;begin if AInitializeProc <> nil then begin AProc := AInitializeProc; if not dxIsDLL then begin IsInitialized := True; AProc; end else InitializeList.Add(AInitializeProc); end; if AFinalizeProc <> nil then FinalizeList.Add(AFinalizeProc);end;最后发现dxCore.pas文件里有2个函数,就是专门初始化的,在DLL里init和退出时finalize。
procedure dxInitialize; stdcall;
procedure dxFinalize; stdcall;
The dxInitialize & dxFinalize procedure must be used if you develop your project with DLLs.
But if you compile your DLL with active runtime packages, you don't need to call dxInitialize & dxFinalize manually.
原来的引用dxGDIPlusAPI修改为dxCore
原来的方法dxGdiPlusInitialize修改为dxInitialize 原来的方法dxGdiPlusFinalize修改为dxFinalizeNote that the dxInitializeGDIPlus and dxFinalizeGDIPlus functions have been moved to the dxCore unit. They were renamed to dxInitialize and dxFinalize respectively.
参考
http://www.cnblogs.com/jupt/p/3922935.html
官方
https://www.devexpress.com/Support/Center/Question/Details/Q470319/dynamic-loaded-dll-with-packages-av-s-in-dxcore
http://bbs.2ccc.com/topic.asp?topicid=414492
https://www.board4all.biz/threads/richeditcontrol-generates-an-error-is-this-a-bug.666000/
https://www.devexpress.com/Support/Center/Question/Details/Q387588/delphi-xe2-and-dxinitializegdiplus-problem