I agree, a wrapper is necessary. But you can write that wrapper with LabVIEW! Here is how it works in general:
Write a VI to be called back.
Create a build specification as a DLL, containing that VI, and build it.
Load the DLL from your application via kernel32.dll/LoadLibraryA().
Get the address of your callback VI within the DLL via kernel32.dll/GetProcAddress().
Pass that address to the function wanting a callback.
when finished, unload the DLL via kernel32.dll/FreeLibrary().
Please note, the loaded DLL runs in a separate application instance. So you can not communicate via queues or events. You can use IPC mechanisms like UDP, but actually the DLL is loaded in the same process, so other methods may be available, too.