2015-05-28 70 views
1

編輯:解決方案是將LPTSTR替換爲wstring。當Windows API需要LPTSTR的wstring的是與鑄造.c_str()LPTSTR失去範圍,變通不工作(C++)

我的問題是,一個變量(LPTSTR)是走出去的範圍,我不能修復它。我會解釋...

在我的代碼中,我試圖保存一個類的圖像的名稱。我正在使用的類保存功能限制,標誌和其他需要保存的變量,例如原始文件目錄。

我使用Windows,因此,當我想要加載圖像的圖像名稱需要在一個LPTSTR(統一啓用)。我已經對Ascii到Unicode的轉換感到厭倦了。

對於我的大部分代碼,我沒有與這個類有關的問題,直到我試圖保存這個圖像名稱。第一次創建和保存圖像名稱時,名稱僅由main創建一個函數,並且可以工作!第二次我使用相同的功能創建一個新的圖像名稱,但函數調用距離主要3級。當第二個級別返回到第一個級別時,我的圖像名稱超出了範圍(該字符串被覆蓋)。

我試圖做一個工作,但3天后,沒有任何工作。

這是我爲這個類的setter設置的代碼。這是殘酷的,因爲它試圖成爲一種工作。

// From the Limit.h 
void Set_BMPName(LPTSTR S); 
LPTSTR BMPName; 

// From the Limit.cpp 
void Limit::Set_BMPName(LPTSTR S) 
{// This function should set BMPName to S. 
    static LPTSTR* StaticString = new LPTSTR(S); 
    // I used static to stop the variable from going out of scope. 
    if (*StaticString != S) 
    { // Because StaticString is static, it wont get updated if the name is changed. 
     delete StaticString; 
     // So delete it. 
     static LPTSTR* StaticString = new LPTSTR(S); 
     // And remake it.. 
    } 
    BMPName = *StaticString; 
    // Then set BMPName to this Static variable. 
    return; 
}; 

我第一次調用Set_BMPName()名稱它的作品。第二次調用setter時,If循環被輸入,但是當新的StaticString被創建時,這些值沒有被賦值。我可能會錯誤地使用「新」運算符嗎?

讓我知道如果你需要看到更多的代碼。謝謝。

回答

2

看,這是與微軟給出的指針類型的名稱是不喜歡看指針的問題。

大號p ointer到Ť CHAR STR荷蘭國際集團source

LPTSTR實際上並不包含的字符串;像char*(或wchar_t*),它只是指向一個。你可以玩所有你喜歡的指針的生命週期,但這不會對實際數據做任何事情。當然,動態分配指針(雖然有創造性的嘗試)將無濟於事。

爲什麼不使用正確的C++技術,如std::string(或std::wstring)呢?然後你將在三分鐘內完成,而不是三天。 :-)

如果你真的被卡住LPTSTR s,則使用專用於那些數據複製到另一個Windows API函數:StringCchCopy

+0

我想這樣做,但是當我調用LoadImage()調用我的圖像時,函數調用將只接受LPTSTR。 Iv試圖保存爲一個字符串,然後將其轉換,但這一切都是徒勞的。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx –

+0

@ChrisEst:閱讀最後一句。不過,你應該已經能夠將'myWstring.c_str()'傳遞給'LoadImage()'。 –

+0

我會嘗試用wstring替換LPTSTR,我懷疑它可以與LoadImage()一起工作,但它的價值還是值得的。 –