This is really very simple: Step 1: The main program calls an initialization point in the DLL, passing a pointer to a structure containing the addresses of all the routines of interest. Step 2: The DLL uses the pointer to call the routine. In more detail: in a header file common to the main code and the DLLs: typedef struct HelperFuncs { void (*one_function)(int something, char another); int (*another_function)(void); ... etc ... }; In the main program: void (*one_function)(int something, char another); int (*another_function)(void); struct HelperFuncs helpers = { one_function, another_function }; InitializeDLL( ..., &helpers, ... ); In the DLL: struct HelperFuncs *hf; void InitializeDLL(..., struct HelperFuncs &helpers, ... ) { hf = helpers; } (hf->one_function)(123,'a'); i = (hp->another_function)(); Bob Ammerman RAm Systems -- http://www.piclist.com hint: The list server can filter out subtopics (like ads or off topics) for you. See http://www.piclist.com/#topics