为什么在失败时通过obj文件测试非导出的静态函数?

时间:2017-11-13 10:25:52

标签: c++ visual-c++

我正在编写一个DLL,它根据调用进程在类中设置静态布尔值。

由于我知道测试环境会检查错误值,因此我将设置代码中的逻辑反转,以确保测试失败。

使用public static bool和导出的getValue()时,按预期方式工作。

切换为private static boolfriend 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,并失败。

1 个答案:

答案 0 :(得分:0)

您可以通过所有访问应用程序/其他DLL共享类/变量的实例。

#pragma data_seg

#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更改它。