15,471
社区成员
发帖
与我相关
我的任务
分享
//公共头文件:
typedef std::vector<int> VEC_INT;
const int _MAX_VEC = 100;
// 虚基类ClassB (DLLB.dll) 函数void GetVector(VEC_INT& rVec) =0; 实现:
// 注:ClassB有许多实例,通过自建堆管理。ClassA调用时会先找到指定的ClassB的实例
void GetVector(VEC_INT& rVec)
{
// SEH异常处理略
VEC_INT::iterator iter = my_vec.begin();
int i = 0;
for (; iter!= my_vec.end() && i != _MAX_VEC; iter++; i++)
{
rVec.push_back(*iter); // Mark1
}
// rVec = my_vec; // Mark2
}
// 类ClassA函数(DLLA.dll)调用ClassB函数的接口,(实际上是通过另一个类ClassC中转的,反正实际调用的就是ClassB的函数)
VEC_INT vec;
// vec.reserve(_MAX_VEC) // Mark3
c->GetVector(vec);
// 之后可以对vec进行各种操作
//主线程:
#include <iostream>
#include <vector> //不include windows,是因为SGI_STL会包含。
#define _MAX_VEC 10000
#define _MAX_LOOP 100
typedef std::vector<int> VEC_INT;
typedef void (*FUNC_MYHEAP)(VEC_INT& , int);
void testSEH(FUNC_MYHEAP MyHeapTest)
{
for (int x= 0; x < _MAX_LOOP; x++)
{
VEC_INT vec[_MAX_VEC];
for (int i = 0; i < _MAX_VEC; i++)
{
__try
{
MyHeapTest(vec[i], 16);
}
__except(puts("in filter"), 1)
{
int err = GetExceptionCode();
cout << err << endl;
cout << &std::__default_alloc_template<true, 0>::_S_start_free << endl;
cout << &std::__default_alloc_template<true, 0>::_S_end_free << endl;
cout << std::__default_alloc_template<true, 0>::_S_free_list[0] << endl;
cout << std::__default_alloc_template<true, 0>::_S_heap_size << endl;
}
}
}
};
void main()
{
HMODULE hMoudle = LoadLibrary("testDLL.dll");
if (hMoudle == NULL)
{
return;
}
FUNC_MYHEAP MyHeapTest = (FUNC_MYHEAP)GetProcAddress(hMoudle, "TestMyHeap");
if (MyHeapTest == NULL)
{
return;
}
testSEH(MyHeapTest);
}
//DLL,本来想用自建堆,不过想想没什么必要,反正随便测试的,名字也就保留这样了。
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#include <vector>
typedef std::vector<int> VEC_INT;
extern "C" DLL_API void TestMyHeap(VEC_INT& vec, int nSize);
void TestMyHeap(VEC_INT& vec, int nSize)
{
for(int i = 0; i < nSize; i++)
{
vec.push_back(i);
}
}