Hi Les,
Just to give you a taste of my ‘soft’ linkage I was developing:
This is what the SheetCAM side would look like:
#define ID_LOADJOB 0x01
void CALLBACK LoadJob(char *);
WORD numInterface;
typedef struct {
WORD *SCInterfaceID;
FARPROC *SCInterface;
} PLUGIN_DATA;
PLUGIN_DATA SCData;
HINSTANCE hPlugin = NULL;
typedef VOID (CALLBACK *PLUGINSTARTUP)(WORD, PLUGIN_DATA *);
typedef VOID (CALLBACK *PLUGINSHUTDOWN)();
PLUGINSTARTUP PluginStartup = NULL;
PLUGINSHUTDOWN PluginShutdown = NULL;
// Build Callback / capabilities table
numInterface = 1;
SCData.SCInterfaceID = (WORD *)calloc(numInterface, sizeof(WORD));
SCData.SCInterface = (FARPROC *)calloc(numInterface, sizeof(FARPROC));
SCData.SCInterfaceID[0] = ID_LOADJOB;
SCData.SCInterface[0] = (FARPROC)(LoadJob);
// Load the plugin DLL
hPlugin = LoadLibrary(“SheetCAMPlugin.dll”);
if (NULL != hPlugin) {
// Call PluginStartup()
PluginStartup = (PLUGINSTARTUP)GetProcAddress(hPlugin,“PluginStartup”);
if (NULL != PluginStartup) {
(*PluginStartup)(numInterface, &SCData);
}
}
And this is what the startup in the DLL would look like:
STDAPI PluginStartup(WORD numInterface, PLUGIN_DATA *scData)
{
int idx;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
DbgMsg(“PluginStartup entry”);
// Setup the SheetCAM callback table
pluginTable.SCInterfaceID = (WORD *)calloc(numInterface, sizeof(WORD));
pluginTable.SCInterface = (FARPROC *)calloc(numInterface, sizeof(FARPROC));
for (idx = 0; idx < numInterface; idx++) {
pluginTable.SCInterfaceID[idx] = scData->SCInterfaceID[idx];
pluginTable.SCInterface[idx] = scData->SCInterface[idx];
}
// Start the callback thread
CreateThread(NULL,0L,CallbackThread,&threadData,0,NULL);
// Since we were called, SheetCAM is running
IsRunning = TRUE;
DbgMsg(“PluginStartup exit”);
return S_OK;
}
Just my two cents. I hope we can make the hard linkage work, it is simpler.
-James