-
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.
Edit/Delete Message
-
this header is an absolute mess. it should not compile on any conforming compiler. the major errors are:
1. default values for parameters are not allowed in a typedef (or in a pointer to a function)
2. you can import variables and functions from a dll, but not a typedef (a typedef is required at compile-time.)
3. use of types that have not been declared
with these corrected, the header would compile. but you must be a very brave programmer if you decide to use it (trust the idiot who wrote this header).
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;
////////////////////////////////////////////////////////
// the following declaraions are required. replace these
// by including the header files containing the declarations
////////////////////////////////////////////////////////
class CICamera ;
class CIFrame;
class GRAB_EXT_ATTR;
class LPCAM_ATTR;
///////////////////////////////////////
typedef PCParentMod (CALLBACK* LPIfxCreateParentModule)(IFC_BOARD_KIND modKind, DWORD modSubkind, DWORD seqnum, char *cfgFile, BOOL inspectOnly);
typedef PCParentMod (CALLBACK* LPIfxCreateCaptureModule)(char *modName,DWORD seqnum, char *cfgFile);
typedef void (CALLBACK* LPProcessCameraFilesInDir)(const PSTR szPath, BOOL bRecurse );
typedef BOOL (CALLBACK* LPEnableJitGrabMemLock)(void);
typedef CICamera (CALLBACK* LPGetCam)(DWORD camPortNum);
typedef HIFCGRAB (CALLBACK* LPGrab)(DWORD dwOptions,pBYTE dest, int ringNumFrames,int totalNumFrames, int x, int y, int dx, int dy);
typedef BOOL (CALLBACK* LPFreeze)(CIFrame *frame);
typedef int (CALLBACK* LPGrabWaitFrameEx)(HIFCGRAB grabID, BYTE **frameAddr, int FrameSeqNum, DWORD milliseconds, BOOL lock,DWORD *acquiredDy, BOOL *VirtualFrameEnd, GRAB_EXT_ATTR *ExtendedAttr);
typedef void (CALLBACK* LPGrabRelease)(HIFCGRAB grabID, int seqNum);
typedef void (CALLBACK* LPGetAttr)(LPCAM_ATTR lpAttr, BOOL zoomCorrected);
extern IFC_IMP_DLL LPIfxCreateParentModule IfxCreateParentModule;
extern IFC_IMP_DLL LPIfxCreateCaptureModule IfxCreateCaptureModule;
extern IFC_IMP_DLL LPProcessCameraFilesInDir ProcessCameraFilesInDir;
extern IFC_IMP_DLL LPEnableJitGrabMemLock EnableJitGrabMemLock;
extern IFC_IMP_DLL LPGetCam GetCam;
extern IFC_IMP_DLL LPGrab Grab;
extern IFC_IMP_DLL LPFreeze Freeze;
extern IFC_IMP_DLL LPGrabWaitFrameEx GrabWaitFrameEx;
extern IFC_IMP_DLL LPGrabRelease GrabRelease;
extern IFC_IMP_DLL LPGetAttr GetAttr;
extern int LoadPCDigDlls();
extern int FreePCDigDlls();
#endif // DLLEXPORTS_H
-
Thanks for the reply. I trust you and yeah I know its a big mess. I am trying to clear it. It might take some time but I am sure that I will clear it.
I have been given strict instructions that, I am not allowed to include any header files, instead write all the necessary classes in the same header file.
Thanks again.
Similar Threads
-
By sushma.varala in forum VB Classic
Replies: 0
Last Post: 07-14-2006, 09:12 AM
-
Replies: 0
Last Post: 01-14-2006, 07:01 PM
-
Replies: 5
Last Post: 10-17-2002, 01:58 PM
-
By Hamed in forum Database
Replies: 0
Last Post: 08-19-2002, 03:20 AM
-
By Larry Hunter in forum ASP.NET
Replies: 2
Last Post: 11-13-2000, 10:06 AM
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
Forum Rules
|
Top DevX Stories
Easy Web Services with SQL Server 2005 HTTP Endpoints
JavaOne 2005: Java Platform Roadmap Focuses on Ease of Development, Sun Focuses on the "Free" in F.O.S.S.
Wed Yourself to UML with the Power of Associations
Microsoft to Add AJAX Capabilities to ASP.NET
IBM's Cloudscape Versus MySQL
|
Bookmarks