CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    May 2009
    Posts
    11

    Smile Trying to dynamically load a class at rutime from DLL

    Hi,

    I am new to coding with macros. I have this code and I am trying to run this by dynamically loading a class from a DLL.

    Code:
    #pragma once
    #ifndef DLLEXPORTS_H
    #define DLLEXPORTS_H
    #ifdef _LoadPCDigDlls_h_
    #define _LoadPCDigDlls_h_
    #define CALLBACK __stdcall
    #define IFC_IMP_DLL  __declspec(dllimport)
    #endif //_LoadPCDigDlls_h_
    
    #define IFCAPI __stdcall
    #define IFCCALL IFC_IMP_DLL IFCAPI
    
    typedef enum {
    	IFC_CAP_MBOARD,		// Image Capture motherboard, e.g., IC-PCI,PCVision
    	IFC_MNG_MBOARD,		// Image Manager motherboard, e.g., IM-PCI
    	IFC_CMC_MBOARD,		// Computational module motherboard, e.g., CMC-PCI
    	IFC_AM_DBOARD,
    	IFC_CM_DBOARD,
    	IFC_DM_DBOARD,
    	IFC_NUM_BOARD_KINDS
    } IFC_BOARD_KIND;
    
    #define IFC_ACTIVE_CAMERA_FLAG 0x8000
    typedef unsigned char    * pBYTE;  
    #define IFC_INFINITE_FRAMES -1
    typedef void *HIFCGRAB;
    
    
    class IFC_IMP_DLL CIobject
    {
    public:
    
    // Object model (types, destruction, allocation)
    	virtual ~CIobject();  // virtual destructors are necessary
    
    #ifdef new
    #define _IFC_SAVE_NEW_
    #undef new
    #endif
    	void* IFCAPI operator new(size_t nSize);
    	void* IFCAPI operator new(size_t nSize,void* p);
    	void  IFCAPI operator delete(void* p);
    #if _MSC_VER >= 1200
    	void IFCAPI operator delete(void* p, void* pPlace);
    #endif
    
    	// for file name/line number tracking using DEBUG_NEW
    	void* IFCAPI operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
    
    #if _MSC_VER >= 1200
    	void IFCAPI operator delete(void* p, LPCSTR lpszFileName, int nLine);
    #endif
    
    #if defined(_IFC_SAVE_NEW_) && defined(_DEBUG) && defined(DEBUG_NEW)
    #define new DEBUG_NEW
    #endif
    #ifdef _IFC_SAVE_NEW_
    #undef _IFC_SAVE_NEW_
    #endif
    
    
    	// Disable the copy constructor and assignment by default so you will get
    	//   compiler errors instead of unexpected behaviour if you pass objects
    	//   by value or assign objects.
    protected:
    	CIobject();
    private:
    	CIobject(const CIobject& objectSrc);              // no implementation
    	void operator=(const CIobject& objectSrc);       // no implementation
    };
    
    class IFC_IMP_DLL CModule : public CIobject 
    {
    public:
    		CModule();
    	virtual ~CModule();
    };
    
    class IFC_IMP_DLL CParentMod : public CModule  
    {
    public:
    	CParentMod();
    	virtual ~CParentMod();
    };
    
    
    typedef CParentMod * PCParentMod;
    
    typedef PCParentMod  (CALLBACK* LPIfxCreateParentModule)(IFC_BOARD_KIND modKind, DWORD modSubkind, DWORD seqnum, char *cfgFile=NULL, BOOL inspectOnly=FALSE);
    typedef PCParentMod  (CALLBACK* LPIfxCreateCaptureModule)(char *modName,DWORD seqnum, char *cfgFile);
    typedef void (IFC_IMP_DLL* LPProcessCameraFilesInDir)(const pSTRING szPath, BOOL bRecurse = FALSE);
    typedef BOOL (IFC_IMP_DLL* LPEnableJitGrabMemLock)(void);
    typedef CICamera (IFC_IMP_DLL* LPGetCam)(DWORD camPortNum=IFC_ACTIVE_CAMERA_FLAG);
    typedef HIFCGRAB (IFC_IMP_DLL* LPGrab)(DWORD dwOptions,pBYTE dest, int ringNumFrames,int totalNumFrames=IFC_INFINITE_FRAMES, int x=0, int y=0, int dx=0, int dy=0);
    typedef BOOL (IFC_IMP_DLL* LPFreeze)(CIFrame *frame);
    typedef int (IFC_IMP_DLL* LPGrabWaitFrameEx)(HIFCGRAB grabID, BYTE **frameAddr=NULL, int FrameSeqNum=IFC_WAIT_NEWER_FRAME, DWORD milliseconds=IFC_WAIT_FOREVER, BOOL lock=TRUE,DWORD *acquiredDy=NULL, BOOL *VirtualFrameEnd=NULL, GRAB_EXT_ATTR *ExtendedAttr=NULL);
    typedef void (IFC_IMP_DLL* LPGrabRelease)(HIFCGRAB grabID, int seqNum);
    typedef void (IFC_IMP_DLL* LPGetAttr)(LPCAM_ATTR lpAttr, BOOL zoomCorrected=TRUE);
    
    extern LPIfxCreateParentModule IfxCreateParentModule;
    extern LPIfxCreateCaptureModule IfxCreateCaptureModule;
    extern LPProcessCameraFilesInDir ProcessCameraFilesInDir;
    extern LPEnableJitGrabMemLock EnableJitGrabMemLock;
    extern LPGetCam GetCam;
    extern LPGrab Grab;
    extern LPFreeze Freeze;
    extern LPGrabWaitFrameEx GrabWaitFrameEx;
    extern LPGrabRelease GrabRelease;
    extern LPGetAttr GetAttr;
    
    extern int LoadPCDigDlls();
    extern int FreePCDigDlls();

    When I build the solution I am getting these errors

    Code:
    1>------ Build started: Project: sprayQC, Configuration: Debug Win32 ------
    1>Compiling...
    1>LoadPCDigDlls.cpp
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(92) : error C2383: 'LPIfxCreateParentModule' : default-arguments are not allowed on this symbol
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(94) : error C2059: syntax error : '__declspec(dllimport)'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(95) : error C2059: syntax error : '__declspec(dllimport)'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(96) : warning C4042: 'LPGetCam' : has bad storage class
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(96) : error C2091: function returns function
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(96) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(97) : error C2059: syntax error : '__declspec(dllimport)'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(98) : error C2059: syntax error : '__declspec(dllimport)'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(99) : error C2059: syntax error : '__declspec(dllimport)'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(100) : error C2059: syntax error : '__declspec(dllimport)'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(101) : error C2059: syntax error : '__declspec(dllimport)'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(105) : error C2146: syntax error : missing ';' before identifier 'ProcessCameraFilesInDir'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(105) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(105) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(106) : error C2146: syntax error : missing ';' before identifier 'EnableJitGrabMemLock'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(106) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(106) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(107) : error C2146: syntax error : missing ';' before identifier 'GetCam'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(107) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(107) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(108) : error C2146: syntax error : missing ';' before identifier 'Grab'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(108) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(108) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(109) : error C2146: syntax error : missing ';' before identifier 'Freeze'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(109) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(109) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(110) : error C2146: syntax error : missing ';' before identifier 'GrabWaitFrameEx'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(110) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(110) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(111) : error C2146: syntax error : missing ';' before identifier 'GrabRelease'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(111) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(111) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(112) : error C2146: syntax error : missing ';' before identifier 'GetAttr'
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(112) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(112) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
    1>c:\projects\sprayqc2601\loadpcdigdlls.h(116) : fatal error C1070: mismatched #if/#endif pair in file 'c:\projects\sprayqc2601\loadpcdigdlls.h'
    1>Build log was saved at "file://c:\Projects\sprayQC2601\Debug\BuildLog.htm"
    1>sprayQC - 35 error(s), 1 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
    Somebody please help me.

    Thanks in advance.

  2. #2
    Join Date
    Nov 2000
    Location
    Voronezh, Russia
    Posts
    6,620

    Re: Trying to dynamically load a class at rutime from DLL

    For dynamical load use not classes but interfaces.
    Best regards,
    Igor

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured