Click here to Skip to main content
15,903,385 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
AnswerRe: Sanity Check on Registry Value REG_MULTI_SZ - format value Pin
Peter_in_278027-Oct-11 13:39
professionalPeter_in_278027-Oct-11 13:39 
GeneralRe: Sanity Check on Registry Value REG_MULTI_SZ - format value Pin
jkirkerx28-Oct-11 6:24
professionaljkirkerx28-Oct-11 6:24 
AnswerRe: Sanity Check on Registry Value REG_MULTI_SZ - format value Pin
Richard MacCutchan27-Oct-11 21:59
mveRichard MacCutchan27-Oct-11 21:59 
GeneralRe: Sanity Check on Registry Value REG_MULTI_SZ - format value Pin
jkirkerx28-Oct-11 6:41
professionaljkirkerx28-Oct-11 6:41 
GeneralRe: Sanity Check on Registry Value REG_MULTI_SZ - format value Pin
Richard MacCutchan28-Oct-11 6:57
mveRichard MacCutchan28-Oct-11 6:57 
GeneralRe: Sanity Check on Registry Value REG_MULTI_SZ - format value Pin
jkirkerx28-Oct-11 7:17
professionaljkirkerx28-Oct-11 7:17 
AnswerI rewrote the my function for WCHAR Pin
jkirkerx28-Oct-11 8:22
professionaljkirkerx28-Oct-11 8:22 
AnswerRe: I rewrote the my function for WCHAR Pin
Richard MacCutchan28-Oct-11 23:13
mveRichard MacCutchan28-Oct-11 23:13 
You've pretty much nailed it, but I have done some tidying up and fixed a couple of minor issues in the code as follows:
C++
WCHAR* CA_Registry::_get_SQLServer_InstalledInstances( void )
{
    HKEY keyHandle;
    WCHAR rgValue[1024];
//  WCHAR szInstance[1024]; // not needed
    // no point in using CString for constant strings
    WCHAR* regPath = L"SOFTWARE\\Microsoft\\Microsoft SQL Server\\";
    WCHAR* regReq = L"InstalledInstances";
    DWORD size1 = sizeof(rgValue);
    // Type; removed as no longer used
    // no need to initialise dwType to zero here
    DWORD dwType;
    // no need to initialise regStatus to REG_MULTI_SZ here
    DWORD regStatus;
 
    int ndx;
    WCHAR *szReturnValue = NULL;
/* variables not needed
    size_t szRgVal;
    int maxStr;
    bool doubleZero;
*/ 
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, regPath, 0, KEY_QUERY_VALUE, &keyHandle) == ERROR_SUCCESS) {
    // no need to initialise dwType to REG_MULTI_SZ here
        regStatus = RegQueryValueEx( keyHandle, regReq, NULL, &dwType, (LPBYTE)rgValue, &size1);
			
        RegCloseKey(keyHandle);	// we're done with the registry so close the key here
        switch ( regStatus ) {
        case ERROR_SUCCESS:								
/*
 * rewrote this part to use standard (Unicode) functions
            ndx = 0;
            doubleZero = false;
            szRgVal = sizeof(rgValue);
 
            for(int i=0; i < szRgVal; i++) {
                if (!rgValue[i] == L'\0') {
                    szInstance[ndx++] = rgValue[i];
                    doubleZero = false;
                }
                else {
                    if (doubleZero == false) {
                        szInstance[ndx++] = L';';
                        doubleZero = true;
                    }
                    else {
                        szInstance[ndx++] = L'\0\0';
                        break;
                    }
                }                    
            }
 */
            // scan the strings, replacing single nulls by semi-colons
            {
                WCHAR* pszString = rgValue;
                while (*pszString)
                {
                    ndx = wcslen(pszString);
                    // add string length so we point at trailing null character
                    pszString += ndx;
                    if (pszString[1] != L'\0')
                    *pszString++ = L';';    // add semi-colon if not the last string
                }
            }
            /* removed this redundant code
            maxStr = wcslen(szInstance);
            szInstance[maxStr-0] = (char)'\0';
            */
            ndx = wcslen(rgValue);	// we need this value below
            // this also needs to be wprintf, as rgValue is Unicode
            wprintf(L" SQL Server Instance: %s %i\n", rgValue, ndx);				
            // following statement is redundant, we already have the printf
            // cout << "key was read successfully\n";

            // copy to new buffer here
            szReturnValue = new wchar_t[ndx + 1]; // +1 for trailing null character
            wcscpy_s(szReturnValue, ndx + 1, rgValue);
            break;
 
        case ERROR_MORE_DATA:
            cout << "Buffer too small\n";
            // your challenge is to fix the code to handle this be allocating a larger buffer
            break;			
 
        default:			
            cout << "Could not read key\n";
        }
    }
    else {
        cout << "Can not open key";
        cin.ignore();
    }
/* moved this functionality to within success case above
    int strSize = sizeof(szInstance);	
    WCHAR *szReturnValue = new wchar_t[strSize];	
        for(int i = 0; i < strSize; i++) {
        szReturnValue[i]=szInstance[i];		    
    }	
    strSize=wcslen(szReturnValue);	
    szReturnValue[strSize-0]=(WCHAR)L'\0';
 */
    return szReturnValue;  // set above
    // this delete statement will never be reached! Also the calling function needs to delete the buffer when finished with it 
//  delete [] szReturnValue;
}

I hope my comments make sense but please let me know if they don't. I have built and tested this code but I do not have the exact content of the registry value so it may need some minor tweaking.
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman



GeneralRe: I rewrote the my function for WCHAR Pin
jkirkerx29-Oct-11 7:39
professionaljkirkerx29-Oct-11 7:39 
GeneralRe: I rewrote the my function for WCHAR Pin
jkirkerx29-Oct-11 8:20
professionaljkirkerx29-Oct-11 8:20 
GeneralRe: I rewrote the my function for WCHAR Pin
Richard MacCutchan29-Oct-11 22:21
mveRichard MacCutchan29-Oct-11 22:21 
GeneralRe: I rewrote the my function for WCHAR Pin
jkirkerx30-Oct-11 6:32
professionaljkirkerx30-Oct-11 6:32 
GeneralRe: I rewrote the my function for WCHAR Pin
Richard MacCutchan30-Oct-11 7:16
mveRichard MacCutchan30-Oct-11 7:16 
GeneralRe: I rewrote the my function for WCHAR - grovel Pin
Richard MacCutchan29-Oct-11 23:19
mveRichard MacCutchan29-Oct-11 23:19 
QuestionRegistry usage in MFC Doc/ View - opinions / commentary wanted Pin
Vaclav_27-Oct-11 5:18
Vaclav_27-Oct-11 5:18 
AnswerRe: Registry usage in MFC Doc/ View - opinions / commentary wanted Pin
Albert Holguin27-Oct-11 5:35
professionalAlbert Holguin27-Oct-11 5:35 
Questionfopen crashed when special characters found. Pin
tagopi27-Oct-11 2:12
tagopi27-Oct-11 2:12 
AnswerRe: fopen crashed when special characters found. Pin
Luc Pattyn27-Oct-11 2:53
sitebuilderLuc Pattyn27-Oct-11 2:53 
AnswerRe: fopen crashed when special characters found. Pin
Chris Losinger27-Oct-11 3:22
professionalChris Losinger27-Oct-11 3:22 
AnswerRe: fopen crashed when special characters found. Pin
David Crow27-Oct-11 4:49
David Crow27-Oct-11 4:49 
AnswerRe: fopen crashed when special characters found. Pin
Andrew Brock27-Oct-11 7:43
Andrew Brock27-Oct-11 7:43 
GeneralRe: fopen crashed when special characters found. Pin
jschell27-Oct-11 8:30
jschell27-Oct-11 8:30 
GeneralRe: fopen crashed when special characters found. Pin
Andrew Brock27-Oct-11 8:36
Andrew Brock27-Oct-11 8:36 
AnswerRe: fopen crashed when special characters found. Pin
Pranit Kothari27-Oct-11 19:01
Pranit Kothari27-Oct-11 19:01 
AnswerRe: fopen crashed when special characters found. Pin
tagopi27-Oct-11 19:40
tagopi27-Oct-11 19:40 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.