导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2017/1/19 10:49:08
标题:
XE10 DLL环境中使用 GDI+ 报错,求解决方法。
浏览:1263
加入我的收藏
楼主:
XE10 DLL环境中使用 GDI+ 报错,进入Create时,自动进入了字符转换的汇编代码, 但是在exe环境下没有问题。 if not FileExists(FBackGroundFileName) then raise Exception.Create(Format(eFileNotFound, [FBackGroundFileName])); BgFileName := WideString(FBackGroundFileName); try FBMPBackground := TGPBitmap.Create(BgFileName); //这里报地址错误 except on E: Exception do begin AMsg := E.Message; end; end; 求解决办法。
----------------------------------------------
天行健,君子以自强不息。
作者:
tiez (骑牛夜旅)
★☆☆☆☆
-
普通会员
2017/1/19 10:51:12
1楼:
看看项目文件的引入文件列表,是不是有哪个文件没有先引入进来,比较下EXE和DLL的,一个一个按顺序加,可能是这种情况
----------------------------------------------
-
作者:
2017/1/19 10:58:19
2楼:
文件都有引入。
----------------------------------------------
天行健,君子以自强不息。
作者:
2017/1/19 11:05:20
3楼:
http://www.bjvnet.com/588880/39106/391065677.html 这里有个同样问题。
----------------------------------------------
天行健,君子以自强不息。
作者:
2017/1/19 15:47:33
4楼:
找到办法,dll下使用稍有不同。
----------------------------------------------
天行健,君子以自强不息。
作者:
2017/1/19 16:03:34
5楼:
又不写解决方案。
----------------------------------------------
-
作者:
2017/1/19 16:10:25
7楼:
我以为楼主 找到办法了,应该会共享一下办法。 现在没说出来,大概是正在整理思路。 但是,等了 20 分钟了,不知道,楼主 思路整理好了没有? 提问的时候,总想着,大家会帮我的。 结果,没人能帮到。 得到答案了,是不是觉得,大家没帮好我,我就可以不公布答案呢? 还是说,答案是你们公司私产,受版权法保护,不能公开?
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/1/19 16:10:40
7楼:
在忙事情呢,大师们,不要急! unit Winapi.GDIPOBJ; initialization if not IsLibrary then begin // Initialize StartupInput structure StartupInput.DebugEventCallback := nil; StartupInput.SuppressBackgroundThread := False; StartupInput.SuppressExternalCodecs := False; StartupInput.GdiplusVersion := 1; GdiplusStartup(gdiplusToken, @StartupInput, nil); end; finalization if not IsLibrary then begin if Assigned(GenericSansSerifFontFamily) then GenericSansSerifFontFamily.Free; if Assigned(GenericSerifFontFamily) then GenericSerifFontFamily.Free; if Assigned(GenericMonospaceFontFamily) then GenericMonospaceFontFamily.Free; if Assigned(GenericTypographicStringFormatBuffer) then GenericTypographicStringFormatBuffer.free; if Assigned(GenericDefaultStringFormatBuffer) then GenericDefaultStringFormatBuffer.Free; GdiplusShutdown(gdiplusToken); end; 也就是说在exe中,程序会调用GdiplusStartup, GdiplusShutdown 在Dll中不会调,只需要dll中输出这两个方法调用一下即可。 或者在exe中在使用前调用GdiplusStartup,不需要使用时GdiplusShutdown
----------------------------------------------
天行健,君子以自强不息。
作者:
2017/1/19 16:12:03
8楼:
最简单的做法。 DLL 支持 初始化 反初始化 函数 用这两个函数 即可。 或者,你 uses 一下这个单元好像也行。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/1/19 16:13:01
8楼:
MSDN参考文档。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms534077(v=vs.85).aspx
----------------------------------------------
天行健,君子以自强不息。
作者:
2017/1/19 16:13:55
9楼:
@wang_80919 都行 关键是要调 GdiplusStartup GdiplusShutdown
----------------------------------------------
天行健,君子以自强不息。
作者:
2017/1/19 16:54:59
10楼:
好。感谢分享,收藏。
----------------------------------------------
-
作者:
tiez (骑牛夜旅)
★☆☆☆☆
-
普通会员
2017/1/20 11:00:37
11楼:
有人能介绍下DLL引用的时候InitUnits代码是怎么调的吗?
----------------------------------------------
-
作者:
tiez (骑牛夜旅)
★☆☆☆☆
-
普通会员
2017/1/21 16:33:56
12楼:
还是把这个单元在项目文件里引用一下吧,这样你也不用再去考虑StartUp和Shutdown在哪写。 你既然能操作到这个说明你项目中已引用过这个单元了,有时有些单元在项目中的引入顺序会有影响,大多是因为单元初始化中的代码执行顺序问题。你直接把这个引用往前放,先放项目第一个引入试试,如果问题消失就放最后一个再试试,如果又出现就不断换位置,看看到底是要在哪个单元之前引入。 我说的这种情况还是挺常见的,造成这种问题的原因是这样的。 1、你在代码的initialization中写了点代码发现要引用某个单元,由于担心循环引入编译报错就习惯性的把这个单元的uses放implementation段了 2、但其实那个单元的initialization中也有初始化环境的代码而且要在你的代码之前执行 3、由于你的uses在implementation段编译器并不能知道你的编译顺序而把单元引入顺序放在你的代码之后了 这种情况下那就会出现你这种问题。解决方法就是我上面说的那样在项目文件中把单元引入排下序。 我猜你写的报错的那个代码可能就是在initialization中做的,是不是这样呢? 但你Exe又没问题,我就有点怀疑,让你先看看Exe的引入顺序。到底是Exe项目代码不同还是你DLL和EXE的初始化写法不同呢?
----------------------------------------------
-