ATTENTION: You are viewing a page formatted for mobile devices; to view the full web page, click HERE.

Other Software > Developer's Corner

Crazy Autohotkey issue

(1/2) > >>

jpprater:
I've already posted about this over at the Autohotkey forum, but maybe someone here has seen this issue before.
I'm having a post-compile issue with one of my scripts.
I have the following two files:
ld.ahk

--- Code: AutoIt ---#include LockDetect.ahk#NoTrayIconIfNotExist, LD_Settings.ini        IniWrite, ., LD_Settings.ini, logsettings, logpathIniRead, LogPath, LD_Settings.ini, logsettings, logpathFormatTime, StartTime,, MM-dd-yyyy_HH-mm-ssFormatTime, StartTime1,, MM-dd-yyyy HH-mm-ssPID := DllCall("GetCurrentProcessId")LogFileName := A_ComputerName . "_" . StartTime . "_" . PID . ".txt"LogFile := LogPath . "\\" . LogFileNameIfNotExist, %LogPath%        FileCreateDir, %LogPath%FileAppend, Process %PID% started at %StartTime1% `n, %LogFile%notify_lock_unlock() on_lock(){        Global LogFile        FormatTime, TimeString,, MM-dd-yyyy HH-mm-ss        FileAppend, Locked at %TimeString% `n, %LogFile%} on_unlock(){        Global LogFile        FormatTime, TimeString,, MM-dd-yyyy HH-mm-ss        FileAppend, Unlocked at %TimeString% `n, %LogFile%}And LockDetect.ahk, copied from notifylockunlock.ahk in http://www.autohotkey.com/forum/topic5359.html.

--- Code: AutoIt ---;--------------------------------------------------------------- ;Notify Lock\Unlock;   This script monitors LockWorkstation calls;;   If a change is detected it 'notifies' the calling script;      On Lock;         This script will call function "on_lock()";      On Unlock;         This script will call fucntion "on_unlock()";IMPORTANT: The functions "on_lock()" and "on_unlock()" DO NOT;exist in this script, they are to be created in the script that;calls notify_lock_unlock() (presumably your main script);---------------------------------------------------------------;Re-purposed by WTO605;Last edited 2009-08-18 16:34 UTC;---------------------------------------------------------------;Based on Winamp_Lock_Pause by MrInferno;Posted: Fri Apr 21, 2006 4:49 am;Source: http://www.autohotkey.com/forum/topic9384.html;---------------------------------------------------------------;Winamp_Lock_Pause was/is based on script codes from "shimanov";Posted: Thu Sep 15, 2005 12:26 am   ;Source: http://www.autohotkey.com/forum/viewtopic.php?t=5359;Posted: Tue Dec 06, 2005 9:14 pm;Source: http://www.autohotkey.com/forum/viewtopic.php?t=6755;--------------------------------------------------------------- ;Initialize global constantsWTS_SESSION_LOCK      :=   0x7WTS_SESSION_UNLOCK      :=   0x8NOTIFY_FOR_ALL_SESSIONS   :=   1NOTIFY_FOR_THIS_SESSION   :=   0WM_WTSSESSION_CHANGE   :=   0x02B1 notify_lock_unlock(){   Global WM_WTSSESSION_CHANGE   Global NOTIFY_FOR_ALL_SESSION    hw_ahk := FindWindowEx( 0, 0, "AutoHotkey", a_ScriptFullPath " - AutoHotkey v" a_AhkVersion )     OnMessage( WM_WTSSESSION_CHANGE, "Handle_WTSSESSION_CHANGE" )     success := DllCall( "wtsapi32.dll\WTSRegisterSessionNotification", "uint", hw_ahk, "uint", NOTIFY_FOR_ALL_SESSIONS )    if( ErrorLevel OR ! success )    {      success := DllCall( "wtsapi32.dll\WTSUnRegisterSessionNotification", "uint", hw_ahk )      ;If DLL registration fails, wait 20 seconds and try again      Sleep, 20000      notify_lock_unlock()      ;MsgBox, [WTSRegisterSessionNotification] failed: EL = %ErrorLevel%   }   return} Handle_WTSSESSION_CHANGE( p_w, p_l, p_m, p_hw ); p_w  = wParam   ;Session state change event; p_l  = lParam   ;Session ID; p_m  = Msg   ;WM_WTSSESSION_CHANGE; p_hw = hWnd   ;Handle to Window{   Global WTS_SESSION_LOCK   Global WTS_SESSION_UNLOCK    If ( p_w = WTS_SESSION_LOCK )    {      on_lock()   }   Else If ( p_w = WTS_SESSION_UNLOCK )    {      on_unlock()   }} FindWindowEx( p_hw_parent, p_hw_child, p_class, p_title ) {   return, DllCall( "FindWindowEx", "uint", p_hw_parent, "uint", p_hw_child, "str", p_class, "str", p_title ) }If I run the above ld.ahk, which has #include lockdetect.ahk at the very top, everything runs perfectly.  I get exactly the behavior I expect.
However, if I compile ld.ahk, which operation should build the code in the included lockdetect.ahk into the resulting .exe file, when I run the .exe, I get the behavior expected up until the script should try to run code included from LockDetect.ahk.  This also happens if I copy the code manually from LockDetect.ahk to the top of ld.ahk.
I am using the very latest version of autohotkey, 1.0.48.05.

jpprater:
I've at least figured out where the problem is really happening.  It's nothing to do with the compiler; it's the DllCall in LockDetect.ahk.  That DllCall is failing repeatedly, and only in the compiled version.
Calling DllCall( "GetLastError" ) returns the error code 87, which translates (according to this reference) into INVALID_PARAMETER.  But I'm sure the parameters given in the DllCall are correct!  If the parameters were wrong, why would they only be wrong in the compiled version, and not also in the original interpreted script?  :huh: :'(

jpprater:
Finally figured it out.  The FindWindowEx call in LockDetect.ahk wasn't finding a valid hWnd for the script after compilation.  Changing the values in that call fixed it.

mouser:
thanks for the explanation, could help others  :up:

Target:
kudos for sticking at it AND advising the fix :Thmbsup:

Navigation

[0] Message Index

[#] Next page

Go to full version