奇怪的回报价值

时间:2014-06-17 02:46:57

标签: c++ winapi

我的代码,

LPSTR Internal::Gz_GetSystemKey( BOOL SHOW_ERROR, BOOL SHOW_KEY ) {

    HW_PROFILE_INFO   HwProfInfo;
    if (!GetCurrentHwProfile(&HwProfInfo)) 
    {
        if(SHOW_ERROR)
            Message::Error( "An Internal Error Has Occurred", "Gizmo Message", TRUE );
        return NULL;
    }

    std::string __clean( (char*)HwProfInfo.szHwProfileGuid );
    __clean.append( std::string( (char*)HwProfInfo.szHwProfileName ) );

    LPSTR neet_key = Crypt::CRC32( Crypt::MD5( (char*)__clean.c_str() ) );

    if (SHOW_KEY)
        Message::Info( neet_key ); // shows expected result

    return neet_key; // returns strange ascii result
};

Gz BOOL Gz_CreateContext( BOOL SHOW_ERROR, BOOL SHOW_KEY ) {

    HKEY CHECK; // key result container
    BOOL RESULT;
    std::wstring neet_key_uni; // must use unicode string in RegSetValueExW

    if ( RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\NEET\\Gizmo\\"), &CHECK) != ERROR_SUCCESS )
        goto CREATE_REG_CONTEXT;
    else
        goto STORE_NEET_KEY;

CREATE_REG_CONTEXT:

    if ( RegCreateKeyA( HKEY_CURRENT_USER, "Software\\NEET\\Gizmo\\", &CHECK ) != ERROR_SUCCESS ) {

        if( SHOW_ERROR )
            Message::Error( "Context Could Not Be Created" );
         RESULT = FALSE;
         goto END_MACRO;
    }

STORE_NEET_KEY:

    LPSTR neet_key = Internal::Gz_GetSystemKey( SHOW_ERROR, SHOW_KEY ); // GetSystemKey generates good key, returns weird ascii
    Message::Notify( neet_key );
    neet_key_uni = std::wstring(neet_key, neet_key+strlen(neet_key));

    if ( RegSetValueEx( CHECK, TEXT("Key"), 0, REG_SZ, (const BYTE*)neet_key_uni.c_str(), ( neet_key_uni.size() + 1 ) * sizeof( wchar_t ) ) != ERROR_SUCCESS ) {

        if( SHOW_ERROR )
            Message::Error( "Context Could Not Be Reached" );
        RESULT = FALSE;
        goto END_MACRO;
    }

    RESULT = TRUE;

END_MACRO:

    RegCloseKey(CHECK); // safely close registry key
    return RESULT;
};

我正在为练习创建一个简单的PC识别库,而不是用于商业用途。

Message::Info( neet_key );

显示

enter image description here

但实际的返回值是

http://gyazo.com/82b25d02e123b56da217c7ff5cb01e57

任何想法为什么? '消息'名称空间/功能只是消息框。至于地穴'命名空间/功能,它们不是手头的问题。

1 个答案:

答案 0 :(得分:3)

来自评论:谁拥有'neet_key'的内存?我的猜测是'Message :: Info'显示一个有效值,因为它的内存结构仍在内存中,但是当你不再在内存中返回它时。因此,返回的值会打印出垃圾。

这是C ++语言的常见问题。我强烈建议您尽可能避免使用原始指针(特别是从函数/方法返回时)。对于字符串,您显然可以使用'std :: string'。