0
#define DebugPrint(x, y) \
{ \
    char *MACROmsg; \
    char *MACROprint; \
    MACROmsg = (char *) malloc (1056); \
    MACROprint = (char *) malloc (1056); \
    sprintf_s(MACROmsg, 1056, "%ws", x); \
    sprintf_s(MACROprint, 1056, MACROmsg, y); \
    MessageBox(NULL, MACROprint, NULL, NULL); \
    if(MACROprint) free(MACROprint); \
    if(MACROmsg) free(MACROmsg); \
}

BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    BOOL bRtn;

    DebugPrint(L"%d\t%ws(0x%08X, 0x%08X, %i, \"%ws\")\0", (2, L"a", 4, 4, 4, L"a"));
    DebugPrint(L"%d\t%s(0x%08X, 0x%08X, %i, \"%s\")\0", (2, "a", 4, 4, 4, "a"));

    ...

你好。我很抱歉因为沮丧而提出问题,但我已经查看了我的代码并将其更改为从这个开始。第一行执行得很好,第二行没有。似乎第二个 %s 在 output.c 中存在问题(Microsoft 的 sprintf 代码)。指针变为空。我会认为他们的代码是完美的,错误在于我的,但我看不到它。

我非常怀疑我是否设法更改了该文件的代码并在它被锁定时意外地重新编译了它,并且我会收到一条警告我的消息。

正在从 C++ .net 应用程序调用 DLL。我也无法想象故障在这里。

我有几个全局变量,如果初始化它们只会初始化为 NULL。它们没有被引用。至少可以说我很沮丧,我不知道还能去哪里看。也许有人遇到了类似的事情,或者想到了问题可能或什至是什么。

非常感谢。

我正在使用 Visual C++ 2008。

ps 代码不同(我通常不会考虑使用 sprint_s(..., "%ws", x) 但那个也导致错误。我希望这段代码没问题,我只是可以'不明白。非常感谢。

4

2 回答 2

2

假设DebugPrint()PrintData()相同,我认为您的问题是括号中的括号x将成为评估宏的一部分。我检查了一个简单的例子:

#define PRINT(x,y) sprintf(x,y)

PRINT( "%s %d", ("hello",42) );

这扩展为sprintf( "%s %d", ("hello",42) ),因此您有一个逗号运算符,并且只传递了一个参数 so sprintf()。使用 variadoc 宏应该可以解决这个问题。

于 2013-08-12T10:06:30.553 回答
2

(2, L"a", 4, 4, 4, L"a")是带有逗号运算符的表达式。

逗号运算符评估它的两侧并产生右侧。你有多个逗号,所以那里的总表达式产生L"a". 摆脱封闭(),它会好起来的。

在您编辑后:我建议摆脱定义并使其成为常规函数,( ,... )并使用varargs并将该可变参数传递给.vsprint_ssprintf

于 2013-08-12T10:07:36.027 回答