OBJECT_ENTRY_AUTO中的困惑
VS2005中,ATL对对象列表的实现做了更改,使用OBJECT_ENTRY_AUTO来实现,我想学习一下这个技术,于是对结构体做了更改,其他都没有改变,为什么总是不能正确的定位呢?在下面这个测试代码中&__pobjMapEntryFirst+1的值,并不是正确的变量地址。大家帮忙看看那里错了。
另外请解释一下ATL$__a的命名,为什么不用ATL_a或者其他的,$在这里有什么特别的意思吗?
{
int i ;
}NSF_TEST_ENTRY;
#pragma section("ATL$__a", read, shared)
#pragma section("ATL$__z", read, shared)
#pragma section("ATL$__m", read, shared)
extern "C"
{
__declspec(selectany) __declspec(allocate("ATL$__a")) NSF_TEST_ENTRY* __pobjMapEntryFirst = NULL;
__declspec(selectany) __declspec(allocate("ATL$__z")) NSF_TEST_ENTRY* __pobjMapEntryLast = NULL;
}
#if !defined(_M_IA64)
#pragma comment(linker, "/merge:ATL=.rdata")
#endif
#ifndef OBJECT_ENTRY_PRAGMA
#define OBJECT_ENTRY_PRAGMA(class) __pragma(comment(linker, "/include:___pobjMap_" #class));
#endif
#define OBJECT_ENTRY_AUTO(class) \
__declspec(selectany) NSF_TEST_ENTRY __objMap_##class = {0}; \
extern "C" __declspec(allocate("ATL$__m")) __declspec(selectany) NSF_TEST_ENTRY* const __pobjMap_##class = &__objMap_##class; \
OBJECT_ENTRY_PRAGMA(class)
OBJECT_ENTRY_AUTO(a);
OBJECT_ENTRY_AUTO(b);
OBJECT_ENTRY_AUTO(c);
int _tmain(int argc, _TCHAR* argv[])
{
NSF_TEST_ENTRY** f = &__pobjMapEntryFirst+1;
NSF_TEST_ENTRY** l = &__pobjMapEntryLast;
for(NSF_TEST_ENTRY** p =f; p < l; p++ )
{
printf( "%d\n", (*p)->i) ;
}
int i = 0;
scanf("%d" , &i );
return 0;
}