DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: jeff1314
今日帖子: 9
在线用户: 2
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 bridge2006 (bridge) ★☆☆☆☆ -
普通会员
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的,一个一个按顺序加,可能是这种情况
----------------------------------------------
-
作者:
男 bridge2006 (bridge) ★☆☆☆☆ -
普通会员
2017/1/19 10:58:19
2楼: 文件都有引入。
----------------------------------------------
天行健,君子以自强不息。
作者:
男 bridge2006 (bridge) ★☆☆☆☆ -
普通会员
2017/1/19 11:05:20
3楼: http://www.bjvnet.com/588880/39106/391065677.html
这里有个同样问题。
----------------------------------------------
天行健,君子以自强不息。
作者:
男 bridge2006 (bridge) ★☆☆☆☆ -
普通会员
2017/1/19 15:47:33
4楼: 找到办法,dll下使用稍有不同。
----------------------------------------------
天行健,君子以自强不息。
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
2017/1/19 16:03:34
5楼: 又不写解决方案。按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片 按此在新窗口浏览图片
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/1/19 16:10:25
7楼: 我以为楼主 找到办法了,应该会共享一下办法。
现在没说出来,大概是正在整理思路。
但是,等了 20 分钟了,不知道,楼主 思路整理好了没有?

提问的时候,总想着,大家会帮我的。
结果,没人能帮到。
得到答案了,是不是觉得,大家没帮好我,我就可以不公布答案呢?

还是说,答案是你们公司私产,受版权法保护,不能公开?
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bridge2006 (bridge) ★☆☆☆☆ -
普通会员
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
----------------------------------------------
天行健,君子以自强不息。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/1/19 16:12:03
8楼: 最简单的做法。
DLL 支持 初始化 反初始化 函数 
用这两个函数 即可。

或者,你 uses 一下这个单元好像也行。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 bridge2006 (bridge) ★☆☆☆☆ -
普通会员
2017/1/19 16:13:01
8楼: MSDN参考文档。

https://msdn.microsoft.com/en-us/library/windows/desktop/ms534077(v=vs.85).aspx
----------------------------------------------
天行健,君子以自强不息。
作者:
男 bridge2006 (bridge) ★☆☆☆☆ -
普通会员
2017/1/19 16:13:55
9楼: @wang_80919 都行
关键是要调
GdiplusStartup
GdiplusShutdown
----------------------------------------------
天行健,君子以自强不息。
作者:
男 crystalmoon (crystalmoon) ★☆☆☆☆ -
盒子活跃会员
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的初始化写法不同呢?
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行76.17188毫秒 RSS