1. A case of really bad c_func
- Posted by Travis Beaty <travisbeaty at arn.net> Aug 27, 2001
- 398 views
--------------Boundary-00=_5NGQG6G0000000000000 charset="iso-8859-1"
2. Re: A case of really bad c_func
- Posted by Derek Parnell <ddparnell at bigpond.com> Aug 27, 2001
- 379 views
Hi Travis, I think this might be the problem... If you use registerw32Function() you must use w32Func() and not c_func(), ---- Derek. ----- Original Message ----- From: "Travis Beaty" <travisbeaty at arn.net> To: "EUforum" <EUforum at topica.com> Sent: Tuesday, August 28, 2001 1:35 AM Subject: A case of really bad c_func Howdy y'all! Well, I'm now extremely close to finishing the Windows Installer; in fact, I m down to the last task that the installer has to perform, that of restarting the machine. I figured there were two ways I could do this. As soon as everything is finished installing, I could issue a message box stating, "OH NUTS! QUICK! HIT CONTROL+ALT+DELETE!" but I felt this would cause undo panic, and make the user think that I live in Redmond, Washington. So instead, I tried to link with the Windows API function ExitWindowsEx(). Here are the three statements leading up to my definition of the atom aExitWindowsEx: -- start of code -- BOOL RemoveDirectory(LPCTSTR lpPathName); aRemoveDirectory = registerw32Function(kernel32, "RemoveDirectoryA", {C_POINTER}, C_ULONG) -- DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer); aGetLogicalDriveStrings = registerw32Function(kernel32, GetLogicalDriveStringsA", {C_ULONG, C_POINTER}, C_ULONG) -- BOOL ExitWindowsEx(UINT nflags, DWORD nReserved); aExitWindowsEx = registerw32Function(user32, "ExitWindowsExA", {C_INT, C_ULONG}, C_INT) -- end of code Later, in closedown(), I attempt to use this ... -- start of code ---------------------- procedure closedown() ---------------------- integer iAns, iExitResult db_close() setText(lblProgress, "Cleaning up house ...") openWindow(frmProgress, Normal) if delTree(TEMP_PATH) then addLogEntry("Cleaned up all of the temporary files") else addLogEntry("Unable to clean up temporary files") end if iAns = message_box( "In order to complete the installation of Euphoria, your machine must now be restarted. This " & "is done so that the modified autoexec.bat file is recognized by Windows. Euphoria may not " & "work properly until the machine is restarted. May the installer reboot your machine at this " & "time?", APPNAME, MB_YESNO + MB_ICONQUESTION) if iAns = IDYES then addLogEntry("Restarted user's machine.") else addLogEntry("User declined restart.") end if writeLogFile(gsInstallDir & LOG_FILE) iExitResult = c_func(aExitWindowsEx, {2, 0}) -- EWX_REBOOT = 2 if not iExitResult then iAns = message_box( "The installer was unable to make your system restart. Therefore, you will need to restart " & "your system manually at this time.", APPNAME, MB_ICONERROR) end if giFinalExit = True addLogEntry("Failed to execute restart.") closeWindow(frmMain) end procedure -- end code At this point, Euphoria complains about a bad routine number. I have attached the ex.err file. Unfortunately, this is one of those *extremely rare* times that a Euphoria error message leaves me in a state of complete bafflement. I have checked, and the routine number does not appear to have been changed by my code before use. I'm pretty sure this isn't a problem with define_c_func, because looking in the docs, it passes a -1 if it cannot link to the function. So the problem is most likely either in my code (the most likely case) or within the innards of win32lib.ew (remote but possible). Any thoughts, solutions, medications? Travis Beaty aka Palo Duro Solutions