我正在编写一个DLL,它根据调用进程在类中设置静态布尔值。
由于我知道测试环境会检查错误值,因此我将设置代码中的逻辑反转,以确保测试失败。
使用public static bool
和导出的getValue()
时,按预期方式工作。
切换为private static bool
,friend DllMain(...)
和导出的getValue()
仍可正常使用。
如果我使getValue()
具有内部链接,然后通过Visual C ++生成的.obj文件链接测试,则测试现在通过EXPECT_EQ(getValue, false)
测试,即使反转逻辑意味着它应该失败(即,getValue应该返回true。)
这里发生了什么?我的猜测是在编译期间覆盖值或删除某些代码。我可以避免这个吗?
Loader.cpp:
bool WINAPI DllMain(HINSTANCE hInstance, DWORD reason, LPVOID lpReserved) {
...
if (falseCondition) {
myClass::isAvailable = false;
} else {
myClass::isAvailable = true;
}
return true;
}
myClass.h
#ifdef MYPROJECT_EXPORTS
#define MYPROJECT_API __declspec(dllexport)
#else
#define MYPROJECT_API __declspec(dllimport)
#endif
class myClass {
friend bool WINAPI DllMain(HINSTANCE, DWORD, LPVOID);
static bool isAvailable;
public:
MYPROJECT_API static bool getAvailable() { return isAvailable; }
};
myClass.cpp
#include myClass.h
bool myClass::isAvailable = false;
在上面的示例代码中,从MYPROJECT_API
行中移除getAvailable()
宏会导致测试返回false
时应返回true
,并失败。
答案 0 :(得分:0)
您可以通过所有访问应用程序/其他DLL共享类/变量的实例。
#pragma data_seg (".mydata")
int i = 0;
char a[32]n = "hello world";
#pragma data_seg()
#pragma comment(linker, "/SECTION:.mydata,RWS"
此处字符串".mydata"
是您的命名部分。您可以将此字符串更改为其他内容。不要忘记在链接器的#pragma comment
中更改它。
样本来自MSDN。我自己使用时添加了#pragma comment
行(也应该在MSDN上详细解释)。
更改data_seg
块中的其中一个变量也会为访问这些变量的任何其他应用程序/ DLL更改它。