After the upgrade from "TMS ComponentPack" to "TMS VCL UI Pack", the application installed on Windows 7 or windows 8.1, crashes after start with the error RunTime Error 217.
The same application works on windows 10 or windows server 2012
Using EurekaLog, I can see that the specific error is Assertion Failure on AdvXPVS.pas at line 1536 during call procedure LOADDLL
I cannot debug the application becouse of my development platform is installed on windows 10.
procedure LoadDLL;
begin
if DLLLoaded then Exit;
DLLHandle := LoadLibrary('UXTHEME.DLL');
if DLLHandle >= 32 then
begin
DLLLoaded := True;
@OpenThemeDataForDpi := GetProcAddress(DLLHandle,'OpenThemeDataForDpi');
Assert(@OpenThemeDataForDpi <> nil);
//*********************************************************
// LINE 1536 START FROM HERE
//*********************************************************
@OpenThemeData := GetProcAddress(DLLHandle,'OpenThemeData');
Assert(@OpenThemeData <> nil);
@CloseThemeData := GetProcAddress(DLLHandle,'CloseThemeData');
Assert(@CloseThemeData <> nil);
@DrawThemeBackground := GetProcAddress(DLLHandle,'DrawThemeBackground');
Assert(@DrawThemeBackground <> nil);
...
...
@EnableTheming := GetProcAddress(DLLHandle,'EnableTheming');
Assert(@EnableTheming <> nil);
end
else
begin
DLLLoaded := False;
{ Error: UXTHEME.DLL could not be loaded !! }
end;
end;
Assembler Information:
---------------------------------------------------------------------------
; Base Address: $1012000, Allocation Base: $400000, Region Size: 10563584
; Allocation Protect: PAGE_EXECUTE_WRITECOPY, Protect: PAGE_EXECUTE_READ
; State: MEM_COMMIT, Type: MEM_IMAGE
;
;
; AdvXPVS.LoadDLL (Line=0 - Offset=33)
; ------------------------------------
01012459 8903 MOV [EBX], EAX
0101245B 833B20 CMP DWORD PTR [EBX], $20
0101245E 0F825F080000 JB +$085F ; ($01012CC3) AdvXPVS.LoadDLL (Line=0)
01012464 C605CC26A60101 MOV BYTE PTR [$01A626CC], 1
0101246B 68E82C0101 PUSH $01012CE8 ; ($01012CE8) AdvXPVS.LoadDLL (Line=0) Data as ANSI: 'O'; Data as UNICODE: 'OpenThemeDataFor...' AdvXPVS.LoadDLL (Line=0)
01012470 8B03 MOV EAX, [EBX]
01012472 50 PUSH EAX
01012473 E864DE40FF CALL -$BF219C ; ($004202DC) Winapi.GetProcAddress
01012478 8BF0 MOV ESI, EAX
0101247A 8935C844BA01 MOV [$01BA44C8], ESI
01012480 85F6 TEST ESI, ESI
01012482 7514 JNZ +$14 ; ($01012498) AdvXPVS.LoadDLL (Line=0)
01012484 B900060000 MOV ECX, $00000600
01012489 BA1C2D0101 MOV EDX, $01012D1C ; ($01012D1C) AdvXPVS.LoadDLL (Line=0) UNICODE: 'C:\Users\Gianluca\Documents\tmssoftware\TMS VCL UI Pack\AdvXPVS.pas' AdvXPVS.LoadDLL (Line=0)
0101248E B8B02D0101 MOV EAX, $01012DB0 ; ($01012DB0) AdvXPVS.LoadDLL (Line=0) UNICODE: 'Assertion failure' AdvXPVS.LoadDLL (Line=0)
;
; Line=0 - Offset=91
; ------------------
01012493 E800A53FFF CALL -$C05B00 ; ($0040C998) System._Assert ; <-- EXCEPTION
01012498 68D42D0101 PUSH $01012DD4 ; ($01012DD4) AdvXPVS.LoadDLL (Line=0) Data as ANSI: 'O'; Data as UNICODE: 'OpenThemeData' AdvXPVS.LoadDLL (Line=0)
0101249D 8B03 MOV EAX, [EBX]
0101249F 50 PUSH EAX
010124A0 E837DE40FF CALL -$BF21C9 ; ($004202DC) Winapi.GetProcAddress
010124A5 8BF0 MOV ESI, EAX
010124A7 8935CC44BA01 MOV [$01BA44CC], ESI
010124AD 85F6 TEST ESI, ESI
010124AF 7514 JNZ +$14 ; ($010124C5) AdvXPVS.LoadDLL (Line=0)
010124B1 B903060000 MOV ECX, $00000603
010124B6 BA1C2D0101 MOV EDX, $01012D1C ; ($01012D1C) AdvXPVS.LoadDLL (Line=0) UNICODE: 'C:\Users\Gianluca\Documents\tmssoftware\TMS VCL UI Pack\AdvXPVS.pas' AdvXPVS.LoadDLL (Line=0)
010124BB B8B02D0101 MOV EAX, $01012DB0 ; ($01012DB0) AdvXPVS.LoadDLL (Line=0) UNICODE: 'Assertion failure' AdvXPVS.LoadDLL (Line=0)
010124C0 E8D3A43FFF CALL -$C05B2D ; ($0040C998) System._Assert
010124C5 68F02D0101 PUSH $01012DF0 ; ($01012DF0) AdvXPVS.LoadDLL (Line=0) Data as ANSI: 'C'; Data as UNICODE: 'CloseThemeData' AdvXPVS.LoadDLL (Line=0)
010124CA 8B03 MOV EAX, [EBX]
010124CC 50 PUSH EAX
010124CD E80ADE40FF CALL -$BF21F6 ; ($004202DC) Winapi.GetProcAddress
Call Stack Information:
-------------------------------------------------------------------------------------------------------------------------------------
|Methods |Details|Stack |Address |Module |Offset |Source |Unit |Class|Procedure/Method |Line |
-------------------------------------------------------------------------------------------------------------------------------------
|*Exception Thread: ID=596; Parent=0; Priority=0 |
|Class=; Name=MAIN |
|DeadLock=0; Wait Chain= |
|Comment= |
|-----------------------------------------------------------------------------------------------------------------------------------|
|7FFFFFFE|03 |00000000|01012493|testxHairPlus.exe|00C12493|AdvXPVS.pas |AdvXPVS | |LoadDLL | |
|00000060|03 |0018FF34|019F4A28|testxHairPlus.exe|015F4A28|AdvXPVS.pas |AdvXPVS | |Initialization | |
|00000060|03 |0018FF3C|0040C512|testxHairPlus.exe|0000C512|System.pas |System | |InitUnits | |
|00000060|03 |0018FF60|0040C57B|testxHairPlus.exe|0000C57B|System.pas |System | |_StartExe | |
|00000020|03 |0018FF64|004147CE|testxHairPlus.exe|000147CE|SysInit.pas |SysInit | |_InitExe | |
|00004020|03 |0018FF6C|01A2435F|testxHairPlus.exe|0162435F|xHairPlus.pas|xHairPlus| |Initialization | |
|7FFF7FFE|03 |0018FF84|75027C02|kernel32.dll |00017C02|KERNEL32.DLL |KERNEL32 | |BaseThreadInitThunk| |
-------------------------------------------------------------------------------------------------------------------------------------
Sometimes we get errors with line numbers off by one. In your case Assert(@OpenThemeDataForDpi <> nil);
is failing because OpenThemeDataForDpi
needs at least Windows 10 1703. As workaround you can write your own version which just ignores dpi
argument and calls standard OpenThemeData
, then when you get nil
pointer set it to your implementation.