Modify

Opened 12 years ago

Closed 12 years ago

Last modified 12 years ago

#500 closed Bug (Fixed)

_ChooseColor 64bit problems

Reported by: Achilles Owned by: Gary
Milestone: 3.2.13.8 Component: Standard UDFs
Version: 3.2.12.0 Severity: None
Keywords: 64 bit color Cc:

Description (last modified by Gary)

I just got a 64bit version of Vista and encountered several problems.

_ChooseColor does not work.

The function return a value as if the user canceled selection even though no sign of the dialog box appears.

Attachments (0)

Change History (17)

comment:1 Changed 12 years ago by TicketCleanup

  • Severity changed from Blocking to None

Automatic ticket cleanup.

comment:2 follow-up: Changed 12 years ago by Gary

I don't have Vista let alone 64bit, maybe another dev can test.

Did you compile your script with the 64 bit compile?

comment:3 in reply to: ↑ 2 Changed 12 years ago by anonymous

Replying to Gary:

I don't have Vista let alone 64bit, maybe another dev can test.

Did you compile your script with the 64 bit compile?

When I installed AutoIt I set it to the options where it would "use 64bit features where possible." So when you right click a script you can either just "Compile Script" or "Compile Script (x86)". I tried "Compile Script" and both _ChooseFont and _ChooseColor failed. They work normally if I compile it with the x86.

comment:4 follow-up: Changed 12 years ago by Gary

Everything looks fine as far as I can tell, might be a structure problem for 64bit.

Try the following change to the function and see if it gives any information:

Func _ChooseColor($iReturnType = 0, $iColorRef = 0, $iRefType = 0, $hWndOwnder = 0)
	Local $custcolors = "int[16]", $tcc, $tChoose, $color_picked, $iResult, $iDialogError

	$tChoose = DllStructCreate($tagCHOOSECOLOR)
	$tcc = DllStructCreate($custcolors)

	If ($iRefType == 1) Then ; BGR hex color to colorref
		$iColorRef = Int($iColorRef)
	ElseIf ($iRefType == 2) Then ; RGB hex color to colorref
		$iColorRef = Hex(String($iColorRef), 6)
		$iColorRef = '0x' & StringMid($iColorRef, 5, 2) & StringMid($iColorRef, 3, 2) & StringMid($iColorRef, 1, 2)
	EndIf

	DllStructSetData($tChoose, "Size", DllStructGetSize($tChoose))
	DllStructSetData($tChoose, "hWndOwnder", $hWndOwnder)
	DllStructSetData($tChoose, "rgbResult", $iColorRef)
	DllStructSetData($tChoose, "CustColors", DllStructGetPtr($tcc))
	DllStructSetData($tChoose, "Flags", BitOR($__MISCCONSTANT_CC_ANYCOLOR, $__MISCCONSTANT_CC_FULLOPEN, $__MISCCONSTANT_CC_RGBINIT))

	$iResult = DllCall("comdlg32.dll", "long", "ChooseColor", "ptr", DllStructGetPtr($tChoose))

	$iDialogError = DllCall("comdlg32.dll", "long", "CommDlgExtendedError")
	If $iDialogError Then 
		MsgBox(0, "$iDialogError", $iDialogError)
		ConsoleWrite("$iDialogError: " & $iDialogError & @lf)
	EndIf

	If ($iResult[0] == 0) Then Return SetError(-3, -3, -1) ; user selected cancel or struct settings incorrect

	$color_picked = DllStructGetData($tChoose, "rgbResult")

	If ($iReturnType == 1) Then ; return Hex BGR Color
		Return '0x' & Hex(String($color_picked), 6)
	ElseIf ($iReturnType == 2) Then ; return Hex RGB Color
		$color_picked = Hex(String($color_picked), 6)
		Return '0x' & StringMid($color_picked, 5, 2) & StringMid($color_picked, 3, 2) & StringMid($color_picked, 1, 2)
	ElseIf ($iReturnType == 0) Then ; return RGB COLORREF
		Return $color_picked
	Else
		Return SetError(-4, -4, -1)
	EndIf
EndFunc   ;==>_ChooseColor

comment:5 in reply to: ↑ 4 Changed 12 years ago by anonymous

Replying to Gary:

Everything looks fine as far as I can tell, might be a structure problem for 64bit.

Try the following change to the function and see if it gives any information:
code

I tried that and it works good. I've encountered some other problems with listviews, should I post those too? I don't really need these fixed since I'm fine with just using 32bit compiling...

comment:6 follow-up: Changed 12 years ago by Gary

I didn't change the function other than adding an dialog error check after the dll call.

Are you saying the function now works?

comment:7 in reply to: ↑ 6 Changed 12 years ago by anonymous

Replying to Gary:

I didn't change the function other than adding an dialog error check after the dll call.

Are you saying the function now works?

Oh sorry, I didn't realize I had only tested it with the normal AutoIt, not 64bit. It still does not work with 64bit.

The function returns -1, and the @error code is set to -3. I think you added the part with the $iDialogError, but that does not get assigned to anything. I put a ConsoleWrite right after it and it showed up as
(I put the | around the value to see if was completely blank).

comment:8 Changed 12 years ago by anonymous

Sorry, I forgot to reread the last part I wrote. It shows up as completely blank.

comment:9 Changed 12 years ago by Gary

made a noob mistake in the above code.

should be:

$iDialogError = DllCall("comdlg32.dll", "long", "CommDlgExtendedError")
	If $iDialogError[0] Then 
		MsgBox(0, "$iDialogError", $iDialogError[0])
		ConsoleWrite("$iDialogError: " & $iDialogError[0] & @lf)
	EndIf

comment:10 Changed 12 years ago by Achilles

With that change, $iDialogError[0] is set to 1 (so it shows the msgbox you added). I added an _ArrayDisplay and that's the only value in the whole array.

comment:11 Changed 12 years ago by Gary

ok the points to an error in the structure size.

comment:12 Changed 12 years ago by Gary

in the structures.au3 replace $tagChooseColor with the following

Global Const $tagCHOOSECOLOR = "dword Size;hwnd hWndOwnder;hwnd hInstance;int rgbResult;int_ptr CustColors;dword Flags;int_ptr lCustData;" & _
		"ptr lpfnHook;ptr lpTemplateName"

This still works in 32bit environment, not sure of 64bit.

comment:13 Changed 12 years ago by Achilles

Ok, that works with 64bit. I suppose that the solution to _ChooseFont is very similar. I'm still having some troubles with listviews. Should I post a more detailed description of those? Like I said above, it doesn't matter much for me...

comment:14 Changed 12 years ago by Gary

  • Component changed from AutoIt to Standard UDFs
  • Description modified (diff)
  • Owner set to Gary
  • Summary changed from 64bit problems to _ChooseColor 64bit problems

A separate ticket needs to be made up for listviews, as it is I'm splitting up the color and font issue

comment:15 Changed 12 years ago by Gary

  • Keywords font removed

comment:16 Changed 12 years ago by Gary

  • Milestone set to 3.2.13.8
  • Resolution set to Fixed
  • Status changed from new to closed

Fixed in version: 3.2.13.8

comment:17 Changed 12 years ago by Gary

see ticket #516 for _ChooseFont

Guidelines for posting comments:

  • You cannot re-open a ticket but you may still leave a comment if you have additional information to add.
  • In-depth discussions should take place on the forum.

For more information see the full version of the ticket guidelines here.

Add Comment

Modify Ticket

Action
as closed The owner will remain Gary.
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.