2013-08-12 79 views
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中有問題(微軟的sprintf代碼)。指針變爲null。我會認爲他們的代碼是完美的,錯誤在於我,但我看不到它。未知(損壞的內存)錯誤。 sprintf_s output.c

我非常懷疑我已經設法更改該文件的代碼,並意外地重新編譯它,因爲它被鎖定,我會有一條消息警告我。

從C++ .net應用程序調用該DLL。我無法想象這裏也有錯。

我有幾個全局變量,如果initalized他們只initalized爲NULL。他們沒有被引用。我很沮喪地說,至少我不知道還有什麼可以看的。也許有人遇到類似的事情,或者有什麼問題可以或可能會有什麼想法。

非常感謝Thankyou。

我使用Visual C++ 2008

附:代碼是不同的(我通常不會考慮使用sprint_s(...,「%ws」,x),但那也是導致錯誤。我期待這個代碼是好的,我不能。算起來非常感謝

+2

我建議發生這種情況,因爲括號內和宏中的參數只會推送最後一個參數(請參閱逗號運算符)。嘗試使用可變宏(http://msdn.microsoft.com/zh-cn/library/ms177415.aspx)或內聯函數。 – user1837009

+1

我認爲'PrintData'可能是'DebugPrint',但是SO的代碼重構有一個錯字? 在宏'DebugPrint'你應該檢查'malloc()'是否*不*返回NULL' – Jimbo

+0

這就是答案謝謝。 :) malloc()正在通過調試器進行檢查。一個函數正在取代sprintf,但感謝。 :) – user2600628

回答

2

假設DebugPrint()PrintData()是我覺得你的問題是,在x括號將是宏觀評估的一部分,同樣我已經籤一個簡單的例子:

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

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

這擴大到sprintf("%s %d", ("hello",42)),所以你有一個逗號運算符,只有一個參數通過所以sprintf()。使用variadoc宏應該可以解決這個問題。

+0

這似乎工作太棒了。謝謝。我不知道爲什麼vswprintf_s不會將字符串轉換爲寬字符串? (vswprintf_s(v,20,L「%s」,「abc」);)我得到「abc」而不是「a \ 0b \ 0c \ 0」 – user2600628

+0

對不起,我還沒有使用寬字符串 –

+0

好吧謝謝你一次再次。:) – user2600628

2

(2, L"a", 4, 4, 4, L"a")是一個帶有逗號運算符的表達式。

逗號運算符評估它的兩側併產生右側。 你有多個逗號,所以總表達式產生L"a"。 擺脫封閉(),它會沒事的。

您的編輯後:我建議擺脫定義,並使其與(,...)的常規功能並使用varargs並將該可變參數傳遞到版本sprintf

+0

它實際上傳遞給一個函數而不是sprintf,但我想查看並找到問題的具體位置。這是一個簡單的捷徑。 :)雖然謝謝。 :) – user2600628