1

我刚刚将一个项目从 Delphi 2006 升级到 Delphi XE。一切都按预期工作,但在我关闭应用程序时出现异常。

它不会在代码行上中断。它在 LEAVE 命令上中断到 CPU 窗口。如果有任何帮助,我已经附上了 Eureka 日志。

EurekaLog 6.0.25

Application:
------------------------------------------------------
  1.1 Start Date      : Fri, 3 Dec 2010 10:44:17 +0100
  1.2 Name/Description: LogoTid.exe
  1.3 Version Number  : 
  1.4 Parameters      : 
  1.5 Compilation Date: Fri, 3 Dec 2010 10:44:15 +0100
  1.6 Up Time         : 5 seconds

Exception:
----------------------------------------------------
  2.1 Date          : Fri, 3 Dec 2010 10:44:22 +0100
  2.2 Address       : 004062A0
  2.3 Module Name   : LogoTid.exe
  2.4 Module Version: 
  2.5 Type          : EInvalidPointer
  2.6 Message       : Invalid pointer operation.
  2.7 ID            : 5E21
  2.8 Count         : 1
  2.9 Status        : New
  2.10 Note         : 

User:
-------------------------------------------------------
  3.1 ID        : oda
  3.2 Name      : 
  3.3 Email     : 
  3.4 Company   : 
  3.5 Privileges: SeIncreaseQuotaPrivilege        - OFF
                  SeSecurityPrivilege             - OFF
                  SeTakeOwnershipPrivilege        - OFF
                  SeLoadDriverPrivilege           - OFF
                  SeSystemProfilePrivilege        - OFF
                  SeSystemtimePrivilege           - OFF
                  SeProfileSingleProcessPrivilege - OFF
                  SeIncreaseBasePriorityPrivilege - OFF
                  SeCreatePagefilePrivilege       - OFF
                  SeBackupPrivilege               - OFF
                  SeRestorePrivilege              - OFF
                  SeShutdownPrivilege             - OFF
                  SeDebugPrivilege                - ON
                  SeSystemEnvironmentPrivilege    - OFF
                  SeChangeNotifyPrivilege         - ON
                  SeRemoteShutdownPrivilege       - OFF
                  SeUndockPrivilege               - OFF
                  SeManageVolumePrivilege         - OFF
                  SeImpersonatePrivilege          - ON
                  SeCreateGlobalPrivilege         - ON
                  SeIncreaseWorkingSetPrivilege   - OFF
                  SeTimeZonePrivilege             - OFF
                  SeCreateSymbolicLinkPrivilege   - OFF

Active Controls:
------------------------------------------------------------------
  4.1 Form Class   : TAppBuilder
  4.2 Form Text    : LogoTid - Delphi XE - uMain [Running] [Built]
  4.3 Control Class: 
  4.4 Control Text : 

Computer:
------------------------------------------------------------------------------------------------
  5.1 Name          : OLE-LAPTOP
  5.2 Total Memory  : 3891 Mb
  5.3 Free Memory   : 778 Mb
  5.4 Total Disk    : 120 Gb
  5.5 Free Disk     : 57,93 Gb
  5.6 System Up Time: 1 day, 23 hours, 16 minutes, 56 seconds
  5.7 Processor     : Intel(R) Core(TM) i5 CPU       M 520  @ 2.40GHz
  5.8 Display Mode  : 1920 x 1200, 32 bit
  5.9 Display DPI   : 96
  5.10 Video Card   : Intel(R) Graphics Media Accelerator HD (driver 8.15.10.2025 - RAM 1721 MB)
  5.11 Printer      : RICOH Aficio 2232C RPCS (driver 1.0.0)

Operating System:
--------------------------------------------
  6.1 Type    : Microsoft Windows 7 (64 bit)
  6.2 Build # : 7600
  6.3 Update  : 
  6.4 Language: Danish
  6.5 Charset : 0


Call Stack Information:
-------------------------------------------------------------------
|Address |Module      |Unit       |Class|Procedure/Method   |Line |
-------------------------------------------------------------------
|Running Thread: ID=5632; Priority=0; Class=; [Main]              |
|-----------------------------------------------------------------|
|00D171A1|LogoTid.exe |LogoTid.dpr|     |                   |32[5]|
|76A73675|kernel32.dll|           |     |BaseThreadInitThunk|     |
-------------------------------------------------------------------



Assembler Information:
-----------------------------------------------------------------
; System.TObject.FreeInstance 
; ----------------------------
00406294  push    ebx
00406295  mov     ebx, eax
00406297  mov     eax, ebx
00406299  call    System.TObject.CleanupInstance
0040629E  mov     eax, ebx
004062A0  call    System._FreeMem                 ; <-- EXCEPTION
004062A5  pop     ebx
004062A6  ret

Registers:
-----------------------------
EAX: 02AF8058   EDI: 00000001
EBX: 004062A5   ESI: 004062A5
ECX: 0041D700   ESP: 0018FE98
EDX: 004062A5   EIP: 004062A0

Stack:               Memory Dump:
------------------   ---------------------------------------------------------------------------
0018FE98: FFFFFF02   004062A0: E8 3B E7 FF FF 5B C3 90 83 C0 CC 8B 00 C3 8B C0  .;...[..........
0018FE9C: 00404B78   004062B0: 84 D2 74 08 83 C4 F0 E8 54 05 00 00 84 D2 74 0F  ..t.....T.....t.
0018FEA0: 02B1CEC0   004062C0: E8 A3 05 00 00 64 8F 05 00 00 00 00 83 C4 0C C3  .....d..........
0018FEA4: 02B1CEC0   004062D0: E8 E3 05 00 00 84 D2 7E 05 E8 82 05 00 00 C3 90  .......~........
0018FEA8: 00404BC2   004062E0: 85 C0 74 07 B2 01 8B 08 FF 51 FC C3 53 56 57 89  ..t......Q..SVW.
0018FEAC: 02B1CEC0   004062F0: C3 89 D7 AB 8B 4B CC 31 C0 51 C1 E9 02 49 F3 AB  .....K.1.Q...I..
0018FEB0: 0018FEE8   00406300: 59 83 E1 03 F3 AA 89 D0 89 E2 8B 4B AC 85 C9 74  Y..........K...t
0018FEB4: 004062A5   00406310: 01 51 8B 5B D0 85 DB 74 04 8B 1B EB ED 39 D4 74  .Q.[...t.....9.t
0018FEB8: 03A02F01   00406320: 1D 5B 8B 0B 83 C3 04 8B 73 10 85 F6 74 06 8B 7B  .[......s...t..{
0018FEBC: 00406865   00406330: 14 89 34 07 83 C3 1C 49 75 ED 39 D4 75 E3 5F 5E  ..4....Iu.9.u._^
0018FEC0: 0045B949   00406340: 5B C3 8B C0 53 56 89 C3 89 C6 8B 36 8B 56 B4 8B  [...SV.....6.V..
0018FEC4: 03A02FA0   00406350: 76 D0 85 D2 74 07 E8 85 36 00 00 89 D8 85 F6 75  v...t...6......u
0018FEC8: 03A02F01   00406360: E9 89 D8 E8 78 06 00 00 5E 5B C3 90 87 D1 81 F9  ....x...^[......
0018FECC: 004062EB   00406370: 00 00 00 FF 73 11 81 F9 00 00 00 FE 72 07 0F BF  ....s.......r...
0018FED0: 00912606   00406380: C9 03 08 FF 21 FF E1 81 E1 FF FF FF 00 01 C1 89  ....!...........
0018FED4: 00000000   00406390: D0 8B 11 E9 A8 59 00 00 C3 8D 40 00 3B C2 0F 94  .....Y....@.;...

- - 编辑

好的,尝试关闭我的部分程序,直到错误消失,并找到了麻烦制造者。

这是我的网络服务 WSDL 生成的代理。如果我创建代理对象而不调用服务上的任何函数,则会引发错误。

我创建了一个测试项目,除了代理对象创建之外没有任何其他代码,它也会引发错误。我也尝试过另一个网络服务,同样的错误。这两个 web 服务都是用 Delphi 2006 (.net 1.1) 创建的。

最后我尝试了在 VS2010 中创建的 .net 4.0 网络服务。没问题。所以 Delphi XE 是项目不兼容 .net 1.1 webservices 或 Delphi 2006 webservices。无论哪种方式都是一团糟。

关于如何解决这个问题的任何想法,也许是一种解决方法?

4

3 回答 3

4

日志在这里没有帮助。它看起来像一个内存损坏问题,如果您的代码对字符串执行索引操作(例如写入字符串的字符位置)并且您没有修复所有将字符串转换为 PChar 或类似代码的代码,就会发生这种情况。

换句话说,您必须仔细分析您的代码。从完全关闭一些模块和代码块开始,直到异常消失。然后开始一一添加。

于 2010-12-14T13:56:45.413 回答
3

可能与string现在是 Unicode 字符串(每个字符 2 个字节)而不是AnsiString(每个字符 1 个字节)的事实有关。如果您使用字符串的原始字节,这是一个主要问题。要解决它,只需将 all stringtoAnsiString和 all charto替换为AnsiChar。当然,这样做会失去对 Unicode 的支持。更好的解决方法是重新编写字符串处理例程。通常,只需要sizeof(char)在这里和那里添加一些乘法因子(=2)。

示例(旧代码):

byteSize = length(str);

示例(新代码):

byteSize = length(str) * sizeof(char);
于 2010-12-14T13:57:24.267 回答
0

找到了解决方案/解决方法。

如果您直接在表单中使用 Web 服务,则会发生该错误。

创建一个空的 vcl 表单项目,使用 wsdl 生成器生成一个 webservice 代理。在使用部分中包含代理类。声明代理的私有对象,然后在表单中创建使用代理类 getXXXXXXX 函数来初始化您的对象。运行项目。

当您关闭表单时,您会遇到异常。

解决方案/解决方法是创建自己的类,并通过该类与 Web 服务代理对话。

于 2010-12-16T14:50:19.907 回答