Hi Byron: Here's some snips that may help. MSDN is your friend if you want to play with the "m" word. Funny you should mention export files. I think they're passe' now. I remember using one, but can't find an old file. I think the snips below are all I do to get it working. I can't find any def file in this project, so I don't thnk I needed it. OH! found one in another project, but it's for DCOM. I think that's the difference. I'm not using one for straight non-COM dlls. Yeah this is a proxy/stub def file for use when calling a server on a remote machine. The snips below are from a program that uses MACRO defs to export and import. Here's the proxy/stub def file anyway: LIBRARY "CryptProj1PS" DESCRIPTION 'Proxy/Stub DLL' EXPORTS DllGetClassObject @1 PRIVATE DllCanUnloadNow @2 PRIVATE GetProxyDllInfo @3 PRIVATE DllRegisterServer @4 PRIVATE DllUnregisterServer @5 PRIVATE Personally, I'd rather see a text based configuration so we can write our own chip implementations, but I think your student could use some help. That ActiveX suggestion... I do that these days since it eliminates having to rebuild the client everytime I modify a component, but I don't think that's a good solution here and it won't make the job any easier. What I'd do is write dll functions to receive a window handle to the calling app and save it. I think you can then use SendMessage() and PostMessage() in the dll and handle it in the WndProc of the main app. You could also set a flag and poll it. As far as callback functions in the dll, IIRC, I read that dlls can't receive winders messages, so callbacks are out, for that. Check MSDN, but I'm pretty sure I remember that. I think there was a workaround. Hell, run a thread in the dll to wait for the low level routine to set a flag via a dll function Done() ------------Main.cpp------- void vpp_on() { // Code to turn the vpp bit on HeyDLL_I_AM_DONE(); } --------dll.dll---------------- .... // thread function loop for(;;) { if(bDone) return; } The program that the below snips come from is a PC Scope program with signal generator. It ran a thread that waited for an event from the soundcard and triggered the scope trace. Elsewhere, I use PostMessage / SendMessage to communicate between GUIs. The GUIs were in the main app and the other stuff happened in dlls. Note: I'm having mail reader probs and haven't gotten my Digest file for the day. Don't even know if Digest is working. I got your post off the web archive. Please e- mail me at mike dot ford at earthlink dot net ( my latest anti-spam address - I exceeded my sneakemail bandwith with all those PICList posts I received :-( ) to let me know if you got this and if the reader mangled it. I'd like to highlight the snips for you, but not sure if PICList likes that. A dll header file: // ************** // The following ifdef block is the standard way of creating macros which make //exporting // from a DLL simpler. All files within this DLL are compiled with the //MWAVSIG_EXPORTS // symbol defined on the command line. this symbol should not be defined on any //project // that uses this DLL. This way any other project whose source files include this file //see // MWAVSIG_API functions as being imported from a DLL, wheras this DLL sees //symbols // defined with this macro as being exported. #ifdef GDATA_EXPORTS #define GDATA_API __declspec(dllexport) #else #define GDATA_API __declspec(dllimport) #endif #include #include "MSig.h" #include #include #ifdef GDATA_EXPORTS GDATA_API MSig* lpMWaveDeckSig[2]; GDATA_API MSig* lpMSig[256]; #else GDATA_API MSig* lpMWaveDeckSig[]; GDATA_API MSig* lpMSig[]; #endif #include //here because the above //sigs must be defined 1st. GDATA_API Router* pMSigRouter; GDATA_API SignalList sigList; //*************8 ... IIRC, GDATA_EXPORTS is defined by the MSVC++ project settings auto magically when you build a dll. you'll have to define it yourself, maybe. I use inclusion gaurds on all my include files. // ****************************************** //the cpp file - this is just the dll entry. other stuff is implemented elsewhere and //includes the above header: GDATA_API BOOL APIENTRY /*__stdcall*/ DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // lpMWaveDeckSig[0] = new MSig; break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; // ******************************************************* } HTH, Mike C -- Active8 -- http://www.piclist.com hint: PICList Posts must start with ONE topic: [PIC]:,[SX]:,[AVR]: ->uP ONLY! [EE]:,[OT]: ->Other [BUY]:,[AD]: ->Ads