#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中有问题(微软的sprintf代码。)指针变为空。我会认为他们的代码是完美的,错误在于我,但我看不到它。
我非常怀疑我已经设法更改了该文件的代码,并在锁定时意外重新编译它,我会收到一条警告我的消息。
从C ++ .net应用程序调用DLL。我无法想象这里的错误。
我有几个全局变量,如果初始化它们只是初始化为NULL。它们没有被引用。至少可以说我很沮丧,我不知道还能在哪里看。也许有人遇到过类似的东西,或者想到了问题可能或者可能是什么。
非常感谢。
我正在使用Visual C ++ 2008。
P.S。代码是不同的(我通常不会考虑使用sprint_s(...,“%ws”,x)但是那个也导致了错误。我希望这段代码没问题,我就是不能想一想。非常感谢。
答案 0 :(得分:2)
假设DebugPrint()
和PrintData()
相同,我认为您的问题是x
中的括号将成为已评估宏的一部分。我查了一个简单的例子:
#define PRINT(x,y) sprintf(x,y)
PRINT( "%s %d", ("hello",42) );
扩展为sprintf( "%s %d", ("hello",42) )
,因此你有一个逗号运算符,只有一个参数传递给sprintf()
。使用variadoc宏可以解决这个问题。
答案 1 :(得分:2)
(2, L"a", 4, 4, 4, L"a")
是一个带逗号运算符的表达式。
逗号运算符评估它的两边并产生右侧。
你有多个逗号,所以那里的总表达式产生L"a"
。
摆脱封闭的()
,一切都会好的。
:我建议摆脱定义并使用( ,... )
使其成为常规函数并使用varargs
并将该varargs传递给vsprint_s
版sprintf
}。