现在的位置: 首页 > 综合 > 正文

导出类中静态成员变量地址唯一性

2013年10月08日 ⁄ 综合 ⁄ 共 3317字 ⁄ 字号 评论关闭

测试目的:测试static成员变量m_tblctrl,在不同库中的地址是否唯一性.
测试结果:导出类库中的静态成员地址,在不同的地方引用是唯一性.

准备工作,使用vc++6.0生成2个导出类的库和一个测试程序:

libTA

// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the LIBTA_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// LIBTA_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef LIBTA_EXPORTS
#define LIBTA_API __declspec(dllexport)
#else
#define LIBTA_API __declspec(dllimport)
#endif

typedef struct tagTABLECTRL
{
	int tblcount;
	char tblcode[4][24];
} TABLECTRL, *LPTABLECTRL, *PTABLECTRL;

// This class is exported from the libTA.dll
class LIBTA_API CLibTA
{
public:
	CLibTA(void);
	// TODO: add your methods here.
public:
	void testA(int nTblNo);
	void printfTbl();
protected:
	static TABLECTRL m_tblctrl;
};

extern LIBTA_API int nLibTA;

LIBTA_API int fnLibTA(void);

 

// libTA.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "libTA.h"

TABLECTRL CLibTA::m_tblctrl;
// This is an example of an exported variable
LIBTA_API int nLibTA=0;

// This is an example of an exported function.
LIBTA_API int fnLibTA(void)
{
	CLibTA a;
	a.testA(0);
	return 'A';
}

// This is the constructor of a class that has been exported.
// see libTA.h for the class definition
CLibTA::CLibTA()
{ 
	return; 
}

void CLibTA::testA(int nTblNo)
{
	if (0 == nTblNo)
	{
		m_tblctrl.tblcount = 1;
		strcpy(m_tblctrl.tblcode[0], "myself");
	}
	else if (1 == nTblNo)
	{
		m_tblctrl.tblcount = 2;
		strcpy(m_tblctrl.tblcode[1], "libTA");
	}
	else if (2 == nTblNo)
	{
		m_tblctrl.tblcount = 3;
		strcpy(m_tblctrl.tblcode[2], "libTB");
	}
	else if (3 == nTblNo)
	{
		m_tblctrl.tblcount = 4;
		strcpy(m_tblctrl.tblcode[3], "testStatic");
	}
}

void CLibTA::printfTbl()
{
	printf("tblcount:%d\n", m_tblctrl.tblcount);
	for (int i = 0; i < 4; i++)
	{
		printf("tblcode:%s\n", m_tblctrl.tblcode[i]);
	}
}

libTB

// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the LIBTA_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// LIBTA_API functions as being imported from a DLL, wheras this DLL sees symbols
// defined with this macro as being exported.
#ifdef LIBTB_EXPORTS
#define LIBTB_API __declspec(dllexport)
#else
#define LIBTB_API __declspec(dllimport)
#endif


// This class is exported from the libTA.dll
class LIBTB_API CLibTB
{
public:
	CLibTB(void);
	// TODO: add your methods here.
public:
	void testB(int nTblNo);
protected:

};

extern LIBTB_API int nLibTB;

LIBTB_API int fnLibTB(void);

 

// libTB.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "libTB.h"
#include "../libTA/libTA.h"
// This is an example of an exported variable
LIBTB_API int nLibTB=0;

// This is an example of an exported function.
LIBTB_API int fnLibTB(void)
{	
	return 'B';
}

// This is the constructor of a class that has been exported.
// see libTA.h for the class definition
CLibTB::CLibTB()
{ 
	return; 
}

void CLibTB::testB(int nTblNo)
{
	CLibTA b;
	b.testA(nTblNo);
}

testStatic

// testStatic.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "../libTA/libTA.h"
#include "../libTB/libTB.h"

// 测试目的:测试static成员变量m_tblctrl,在不同库中的地址是否唯一性.
// 测试结果:导出类库中的静态成员地址,在不同的地方引用是唯一性.

int main(int argc, char* argv[])
{
	fnLibTA();

	CLibTA a;
	a.testA(1);

	CLibTB b;
	b.testB(2);

	CLibTA c;
	c.testA(3);

	CLibTA d;
	d.printfTbl();
	return 0;
}

结果

tblcount:4

tblcode:myself

tblcode:libTA

tblcode:libTB

tblcode:testStatic

抱歉!评论已关闭.