MSVC:在程序中嵌入数据

时间:2010-03-04 07:30:08

标签: c++ visual-c++

我希望有人之前遇到过这类问题,可以给我一些解决方法。

使用Microsoft Visual C ++ 2005,我在程序中有这个代码:

DWORD locator[FOURXFLAGCOUNT+1]={
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x00000000
};

我的想法是让外面发现locator - 程序 - 即另一个程序正在填写它,以便这个程序将它内置于它启动了。这是一个防盗的东西,所以没有传统的方法来获取数据,它必须做这样的事情。

当我自己编译程序时,这很好用,但是当我向程序添加一个静态库时,数据就消失了。 locator符号仍然存在;它应该被初始化的数据(以及应该在它之外可见的数据)不是。

链接器开关/ OPT:NOREF解决了这个问题,但价格无法接受:程序增长了几百K(看起来不是很多,但在这种情况下)。使用#pragma comment(linker, "/include:?locator@@BLAHBLAH")(不记得“BLAHBLAH”部分是什么)没有做任何事情 - locator符号已经可见,它只是没有被初始化。将locator定义移动到库中也无济于事。

放弃静态库是最后的选择,如果我能避免它,我宁愿不这样做。

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

我无法找到任何可接受的解决方案。链接器对于它修剪的东西过于咄咄逼人......也许是一个错误,也许是故意的,虽然对于我的生活,我无法想象你会想要消除初始化的情况保持变量本身的变量。

目前,我已打开/ OPT:NOREF选项。我只需要处理额外的尺寸,至少在我找到解决方法之前。

答案 1 :(得分:0)

您可以尝试将DWORD定位器更改为静态DWORD定位器。不确定它是否会有所帮助,只是一个想法。或者,在代码中的其他位置包含对定位器的引用。

答案 2 :(得分:0)

添加使用locator的功能,例如它构建了xor。您不需要调用此函数,但必须通过将其添加到.DEF文件或使用__declspec( DllExport )来导出它。

答案 3 :(得分:0)

定位器是否因为没有引用它而被优化的问题?在你的主程序中加入这样的东西有帮助吗?

DWORD d=0;
int i=0;
for (i=0; i<FOURXFLAGCOUNT; i++) d += locator[i];

或者就是这样,但也许不是在所有编译器上:

(void)locator[0];

答案 4 :(得分:0)

如果声明数组extern,它会有所不同吗?