簡體   English   中英

C ++表達式必須具有類類型-字符串以const char *

[英]C++ Expression Must Have Class Type - String to const char*

嘗試將string轉換為const char*會在底部顯示“表達式必須具有類類型”。 在沒有運氣的情況下嘗試了一些變體。 有任何想法嗎?

string GetMachineID()
    {
        // LPCTSTR szHD = "C:\\";  // ERROR
        string ss;
        ss = "Err_StringIsNull";
        UCHAR szFileSys[255],
            szVolNameBuff[255];
        DWORD dwSerial;
        DWORD dwMFL;
        DWORD dwSysFlags;
        int error = 0;

        bool success = GetVolumeInformation(LPCTSTR("C:\\"), (LPTSTR)szVolNameBuff,
            255, &dwSerial,
            &dwMFL, &dwSysFlags,
            (LPTSTR)szFileSys,
            255);
        if (!success)
        {
            ss = "Err_Not_Elevated";
        }
        stringstream errorStream;
        errorStream << dwSerial;
        return string(errorStream.str().c_str());
    }

    const char *cstr = GetMachineID.c_str();
const char *cstr = GetMachineID.c_str();

一定是

const char *cstr = GetMachineID().c_str();

但是無論如何,請考慮一下指針會發生什么。 它將GetMachineId() ,因為GetMachineId()返回的std::string對象在語句末尾被銷毀了。

您應該為指針分配內存並使用strcpy ,或者最好是在代碼中擺脫char*在所有地方使用std::string

相關: 如何將std :: string轉換為const char *或char *?

您在此代碼中犯了一些大錯誤,其中最重要的錯誤是您完全錯誤地管理了文本緩沖區並使用了無效的類型轉換。 為此,您不必使用存儲在緩沖區中的值,因此根本不需要分配它們,可以為這些參數(以及其他未使用的參數)傳遞NULL,因此GetVolumeInformation()忽略它們。

至於實際的編譯器錯誤,@ vsoftco已經回答了這一問題。 您缺少實際調用 GetMachineID()所需的參數,並且對返回值的處理不正確。

使用類似以下的內容:

string GetMachineID()
{
    DWORD dwSerial;
    ostringstream oss;

    if (!GetVolumeInformation(TEXT("C:\\"), NULL, 0, &dwSerial, NULL, NULL, NULL, 0);
        oss << "Err_Not_Retrieved_" << GetLastError();
    else
        oss << dwSerial;

    return oss.str();
}

std::string machid = GetMachineID();
const char *cstr = machid.c_str();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM