日期:2014-05-18  浏览次数:21175 次

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.