Marc-Andre, with all due respect, I think you are mistaken.
Here's what the docs say:
"A self-installing plug-in can also implement anXSIUnloadPlugin
<http://softimage.wiki.softimage.com/sdkdocs/cb_XSIUnloadPlugin.htm#Rzmcb_XSIUnloadPlugin>function.
Softimage callsXSIUnloadPlugin
<http://softimage.wiki.softimage.com/sdkdocs/cb_XSIUnloadPlugin.htm#Rzmcb_XSIUnloadPlugin>whenever
the plug-in is unloaded (for example, from the Plug-in Manager or when
Softimage exits).XSIUnloadPlugin
<http://softimage.wiki.softimage.com/sdkdocs/cb_XSIUnloadPlugin.htm#Rzmcb_XSIUnloadPlugin>allows
you to clean up any resources allocated byXSILoadPlugin
<http://softimage.wiki.softimage.com/sdkdocs/cb_XSILoadPlugin.htm#Rzmcb_XSILoadPlugin>."
In fact XSILoadPlugin and XSILoadPlugin _do_ work as a pair. What is
'undefined' is the behavior where XSILoadPlugin fails at some point and
returns something other than CStatus::OK - I am not completely sure but
I think in this case, XSIUnloadPlugin would not be called. This is why I
recommend that it be implemented as a general cleanup function that can
be reentered several times without causing any harm. In our own code, we
have this design in place, and if for some reason we need to 'return
CStatus::Fail', we invoke XSIUnloadPlugin manually before that, just to
be sure.
It is also worth mentioning that XSIUnloadPlugin needs to take care of
releasing internal stuff only; registered commands, event handlers,
shaders, etc. do not need 'de-registration'; the PluginRegistrar keeps
track of those objects and will unregister as necessary.
On 10/26/2012 1:49 AM, Marc-Andre Belzile wrote:
I think this is already covered somewhere in the doc. XSIUnloadPlugin gets
called when the plugin is unloaded by the plugin manager (explicitly or when
XSI exits). It is also called through the Application.UnloadPlugin API or if
XSILoadPlugin fails.
XSILoadPlugin is used for registering plugin items in the system. When
XSILoadPlugin returns successfully, XSI will unload the plugin dll with the
Win32 API FreeLibrary and will not call XSIUnloadPlugin.
XSILoadPlugin and XSIUnloadPlugin doesn't really work as a 'pair', therefore
it's not a good idea to allocate resources directly in XSILoadPlugin. You
should probably do it through custom commands or events. Ideally we should have
plugin entry-points for allocating and deallocating resources.
-mab
From: softimage-boun...@listproc.autodesk.com
[mailto:softimage-boun...@listproc.autodesk.com] On Behalf Of Kamen Lilov
Sent: Thursday, October 25, 2012 1:58 PM
To: softimage@listproc.autodesk.com
Subject: Re: SDK: When *exactly* does XSIUnloadPlugin get called
For example, if XSILoadPlugin() terminates prematurely by returning
XSI::CStatus::Fail, does XSIUnloadPlugin() get called? Or does
XSIUnloadPlugin() only get called if XSILoadPlugin() returns XSI::CStatus::OK
indicating the plugin has successfully completed loading? If XSIUnloadPlugin()
gets called in all cases, are there exceptions to what will/won't be available
in that callback?
Maybe some of the Autodesk devs could provide a definite answer. However, if I
had that architectural issue (and I've had it before :) ), I would play it safe
and write the XSIUnloadPlugin code in such a way as to allow it to work cleanly
even if called multiple times, or after a partially completed XSILoadPlugin.
Just set any pointers to released memory to NULL (so that a potential repeated
delete/free would just work as a no-op), set DLL handles to NULL after calling
FreeLibrary on them, etc.
Defensive coding should always be applied to cleanup methods / destructors,
IMHO.
K.