C#调用(C++)DLL导出类的求助
现,用C++编写一个DLL,程序由以下几部分组成:
1)DLLBASE.h//该文件定义接口虚函数
#ifndef DLLBASE_H
#define DLLBASE_H
//////////////////////////////////////////////////////////////////////////
#ifndef DLLBASE_API
#define DLLBASE_API __declspec(dllimport)
#endif
//////////////////////////////////////////////////////////////////////////
class DLLBASE_API DllBase
{
public:
virtual int GetNum()=0;
virtual void SetNum(int)=0;
};
//////////////////////////////////////////////////////////////////////////
extern "C" DLLBASE_API //外部接口导入
DllBase *CreateObject(int type);//接口函数,将在DllDemo.cpp中产生一个具体的实现
//////////////////////////////////////////////////////////////////////////
#endif //DLLBASE_H
2)DLLDEMO.H //DLL类、函数的定义
#ifndef DLLDEMO_H
#define DLLDEMO_H
#include <stdio.h>
//////////////////////////////////////////////////////////////////////////
#include "DllBase.h"
//创建基于DllBase的类DllDemo
class DllDemo : public DllBase{
private:
int m_nNum;
public:
DllDemo();
DllDemo(int);
~DllDemo();
void CreateObject(int type);//自有函数
//DllBase虚函数的具体实现/////////////////////////////////////////
int GetNum(); //virtual int GetNum()=0;
void SetNum(int); //virtual void SetNum(int)=0;
//////////////////////////////////////////////////////////////////////////
};
//////////////////////////////////////////////////////////////////////////
#endif /*DLLDEMO_H*/
3)DllDemo.cpp //类的实现
#define DLLDEMO_API __declspec(dllexport)
//////////////////////////////////////////////////////////////////////////
//DllDemo类的实现
#include "DllDemo.h"
////函数的定义
DllDemo::DllDemo()
:m_nNum(0)
{
printf("In Default Constructor of DllBase in DLL1. m_nNum = %d\n", m_nNum);
}
DllDemo::~DllDemo()
{
printf("In Destructor of DllBase in DLL1. m_nNum = %d\n", m_nNum);
}
DllDemo::DllDemo(int n)
{
m_nNum = n;
printf("In Second Constructor of DllBase in DLL1. m_nNum = %d\n", m_nNum);
}
int DllDemo::GetNum()
{
printf("In GetNum of DllBase in DLL1. m_nNum = %d\n", m_nNum);
return m_nNum;
}
void DllDemo::SetNum(int n)
{
m_nNum = n;
printf("In SetNum of DllBase in DLL1. m_nNum = %d\n", m_nNum);
}
void DllDemo::CreateObject(int type)
{
if (type==1)
{
printf("Create An Object!\n");
}
else
printf("No Object Created!\n");
}
//////////////////////////////////////////////////////////////////////////
//
DLLDEMO_API //导出Dll
DllBase* CreateObject(int type) //接口函数的实现
{
DllDemo *demo = new DllDemo; //产生类的一个具体实现,即导出类
demo->CreateObject(type); //调用自有函数
return demo; //返回指针变量,即导出类的入口地址
}
4)Dll1.cpp //DLL入口函数
// Dll1.cpp : Defines the entry point for the DLL application.
#include <windows.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////////
#include "DllDemo.h"
//////////////////////////////////////////////////////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("Loading DLL1\n");
break;
case DLL_PROCESS_DETACH:
printf("Unloading DLL1\n");
break;
}
return TRUE;
}
调用该程序生成的DLL,一般做法是使用三个文件:DllBase.h、Dll1.dll、Dll1.