如何调用dll中的类和类的成员函数?

chenhongyan 2002-11-12 03:47:47
我在dll中定义了一个类,并且在类中定义了类的成员函数,现在需要在一个*.exe中,调用该类和类的成员函数,可是在调用成员函数的时候就出现了错误,请问个各位大虾如何调用dll中的类和类的成员函数,谢谢!//bow
...全文
603 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruihuahan 2002-11-13
  • 打赏
  • 举报
回复
up
rivershan 2002-11-12
  • 打赏
  • 举报
回复
关于导出类

要输出整个的类,对类使用_declspec(_dllexpot);要输出类的成员函数,则对该函数使用_declspec(_dllexport)。如:

class AFX_EXT_CLASS CTextDoc : public CDocument
{

}

extern "C" AFX_EXT_API void WINAPI InitMYDLL();


新建两个工程,其中一个是dll工程(我的示例程序中这个工程名为DllClass),另一个是测试和使用dll的工程(名字为DllClassTest)


注意点:
1. Dll工程编译完成后,将.lib和.dll文件拷贝到测试和使用dll的工程的适当目录下(我的程序是release目录),然后将Dll工程中的导出类的头文件(以下简称头文件)拷贝到测试和使用dll的工程的适当目录下(在我的程序中是拷贝到此工程文件所在目录),然后把这个拷贝过来的头文件通过下面2和3进行修改。

2. 在Dll工程中的头文件使用的是 #define DLLCLASS_API __declspec(dllexport) 表示导出
在测试和使用dll的工程中的头文件使用的是 #define DLLCLASS_API __declspec(dllimport) 表示导入

3. 不论Dll工程的头文件如何实现(比如说包括内联函数等等),在测试和使用dll的工程中的头文件中全部都是声明而没有定义(即将类成员函数的实现部分去掉)

4。在测试和使用dll的工程的那个文件中包含对dll库的引入,分两步:

首先在是测试和使用dll的工程的setting菜单(按ALT+F7可以调出)中的LINK选项卡中的Object/Librarymodules:下填写对 dll 的连接,比如dll文件名字为DllClass.lib和DllClass.dll,则填写 ../Release/DllClass.lib(注意目录,我的程序中.lib文件是在目录release下)。
然后,添加对头文件的包含,比如dll文件名字为DllClass.lib和DllClass.dll,头文件为DllClass.h,则包含头文件为 #include "DllClass.h"

由此,就可以使用了。

相关源码如下:

dll工程中的DllClass.h 内容:

//此处在dll的头文件中为 dllexport,在应用文件中为dllimport

#defineDLLCLASS_API__declspec(dllexport)

//导出一个类(包括其方法、属性)
classDLLCLASS_APICDllClass
{
public:
CDllClass(void);
voidMSG(constchar*conststr);
};

dll工程中的DllClass.cpp内容:
#include"stdafx.h"
#include"DllClass.h"

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch(ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
 break;
}
return TRUE;
}


CDllClass::CDllClass()
{
 return;
}

void CDllClass::MSG(const char* const str)
{
MessageBox(NULL,str,"",MB_OK);
}

Dll测试工程中的DllClass.h内容:

//此处在dll的头文件中为 dllexport,在应用文件中为dllimport
#define DLLCLASS_API __declspec(dllimport)

//导出一个类(包括其方法、属性)
class DLLCLASS_API CDllClass
{
public:
 CDllClass(void);
 void MSG(const char* const str);
};
Dll测试工程中DllClassTest.cpp内容:
首部:
#include "DllClass.h"
class DllClass;

代码部分:
CDllClass CTest;
CTest.MSG("this is a string into dll");
shinesi 2002-11-12
  • 打赏
  • 举报
回复
我没用过 AFX_EXT_CLASS ,我原来是这样写的

///////////////////.H文件:

#if !defined (_H_CUTLIST_20021024_)
#define _H_CUTLIST_20021024_

#if defined( CUTLIST_EXPORTS )
#define CUTLIST_API __declspec( dllexport )
#else
#define CUTLIST_API __declspec( dllimport )
#endif

#include "stdafx.h"

class CUTLIST_API CAudioRecorderDll
{
private:
DWORD g_Recorder;

public:
CAudioRecorderDll(HWND hwnd=0,DWORD dwSamplePerSec=32000,DWORD dwBits=16,DWORD dwChannel=2);

~CAudioRecorderDll();

void SetVolume( int Value );

void StartRecording( TCHAR * lpszFileName , DWORD dwStartFrame );

void StopRecording();
};


#endif


//////////////////.CPP文件:

#include "stdafx.h"
#include <afxdllx.h>

#include "RecordSound.h"

static AFX_EXTENSION_MODULE CutListDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("CUTLIST.DLL Initializing!\n");

// Extension DLL one-time initialization
if (!AfxInitExtensionModule(CutListDLL, hInstance))
return 0;
new CDynLinkLibrary(CutListDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("CUTLIST.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(CutListDLL);
}
return 1; // ok
}




CAudioRecorderDll::CAudioRecorderDll(HWND hwnd,DWORD
dwSamplePerSec,DWORD dwBits,DWORD dwChannel)
{
g_Recorder = (DWORD) new CAudioRecorder
(hwnd,dwSamplePerSec,dwBits,dwChannel);
}

CAudioRecorderDll::~CAudioRecorderDll()
{
CAudioRecorder * lpRecorder = (CAudioRecorder *)g_Recorder;
delete lpRecorder;
}

void CAudioRecorderDll::SetVolume( int Value )
{
CAudioRecorder * lpRecorder = (CAudioRecorder *)g_Recorder;
lpRecorder->OnSetVolume( Value );
}
freelove1 2002-11-12
  • 打赏
  • 举报
回复
用 AFX_EXT_CLASS 导出整个类
Class AFX_EXT_CLASS MyObject Pulbic :CObject

chenhongyan 2002-11-12
  • 打赏
  • 举报
回复
//导线基类
class AFX_EXT_CLASS CTraverse:public CObject
{
public:
int id;//DXCL_HEAD_ID
int SiteNum;//测点个数
//测站点数组
//TraverSite *OriginalSite;
CTypedPtrArray <CObArray,TraverSite*> m_SiteOriginalArray;//存放原始数据
//附和导线的第一条记录记录起始方位角
//以及起算点和定向点
//TraverSite *ComputedSite;
CTypedPtrArray <CObArray,TraverSite*> m_SiteComputedArray;//计算后的数据(未经平差)

/*导线级别*/
int DXJB;
/*导线类型*1--闭合导线,2--附和导线,3--支导线*/
int TRAVERTYPE;
public:
CTraverse(); //构造函数

void AddSite(TraverSite *Site,int Index); //增加一个测站
void DeleteSite(int Index); //删除一个测站
void EditSite(int Index,TraverSite *NewSite); //编辑一个测站的数据
TraverSite *GetSite(int Index); //返回测点

int GetTraverseID()
{
return id;
}
int GetTraverType()
{
return TRAVERTYPE;
}
int GetTraverLevel()
{
return DXJB;
}
};
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//.cpp
//构造函数
CTraverse:: CTraverse()
{
SiteNum=0;

id=-1;

}

void CTraverse::AddSite(TraverSite *Site,int Index) //增加一个测站
{
m_SiteOriginalArray.InsertAt(Index,Site);
SiteNum++;


}

void CTraverse::DeleteSite(int Index) //删除一个测站
{
m_SiteOriginalArray.RemoveAt(Index);
SiteNum--;
}


void CTraverse::EditSite(int Index,TraverSite *NewSite)
{
m_SiteOriginalArray.RemoveAt(Index);
m_SiteOriginalArray.InsertAt(Index,NewSite);
}

TraverSite* CTraverse::GetSite(int Index)
{
if((Index>=0)&&(Index<m_SiteOriginalArray.GetUpperBound()))

return m_SiteOriginalArray.GetAt(Index);

}
aben456 2002-11-12
  • 打赏
  • 举报
回复
是要有一个关键字的,好象叫 EXT_CLASS还是什么的我记得不太清楚了,你可以在CSDN中搜索DLL看看
shinesi 2002-11-12
  • 打赏
  • 举报
回复
把你DLL的头文件写出来看看

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧