Skip to content

Fix Advapi32#RegisterServiceCtrlHandler using wrong Handler type#1722

Open
dbwiddis wants to merge 1 commit intojava-native-access:masterfrom
dbwiddis:fix-registerservicectrlhandler-type
Open

Fix Advapi32#RegisterServiceCtrlHandler using wrong Handler type#1722
dbwiddis wants to merge 1 commit intojava-native-access:masterfrom
dbwiddis:fix-registerservicectrlhandler-type

Conversation

@dbwiddis
Copy link
Copy Markdown
Contributor

@dbwiddis dbwiddis commented May 10, 2026

The lpHandlerProc parameter of RegisterServiceCtrlHandler resolved to com.sun.jna.Library.Handler (an InvocationHandler) instead of the correct Winsvc.Handler (a StdCallCallback). The import for Winsvc.Handler was missing while Winsvc.HandlerEx was imported.

The javadoc already correctly referenced Winsvc.Handler but the actual type resolution was wrong.

Note: @matthiasblaesing observed that RegisterServiceCtrlHandler has runtime issues when called from non-C code, and RegisterServiceCtrlHandlerEx (already correctly bound) is the recommended successor. This PR fixes the type signature for correctness regardless.

Closes #1510

Closes java-native-access#1510

The lpHandlerProc parameter resolved to Library.Handler (an
InvocationHandler) instead of Winsvc.Handler (a StdCallCallback).
Add the missing import for Winsvc.Handler.
Copy link
Copy Markdown
Member

@matthiasblaesing matthiasblaesing left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not enough. With javap you can see that the result of this change is not the desired one. I get:

matthias@enterprise:~/src/jnalib/contrib/platform/build/classes/com/sun/jna/platform/win32$ javap Advapi32.class  | grep RegisterServiceCtrlHandler                                                                                    
  public abstract com.sun.jna.platform.win32.Winsvc$SERVICE_STATUS_HANDLE RegisterServiceCtrlHandler(java.lang.String, com.sun.jna.Library$Handler);                                                                                   
  public abstract com.sun.jna.platform.win32.Winsvc$SERVICE_STATUS_HANDLE RegisterServiceCtrlHandlerEx(java.lang.String, com.sun.jna.platform.win32.Winsvc$HandlerEx, com.sun.jna.Pointer);                                            
matthias@enterprise:~/src/jnalib/contrib/platform/build/classes/com/sun/jna/platform/win32$ 

The class provided by the implemented interface gets priority.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Incorrect type is used for Advapi32.RegisterServiceCtrlHandler callback

2 participants