Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. How to convert LPTSTR to BSTR?

How to convert LPTSTR to BSTR?

Scheduled Pinned Locked Moved C / C++ / MFC
questionjsonperformancetutorialannouncement
14 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B Offline
    B Offline
    balakrishnan vinchu
    wrote on last edited by
    #1

    In my project i am using FormatMessage API which is returning the LPTSTR buffer pointer lpMsgBuf, if i use CComBstr Message(lpMsgBuf); to copy the lpMsgBuf to BSTR. But this conversion shows memory leak. I am using LocalFree(lpMsgBuf); to release the lpMsgBuf. I am using USES_CONVERSION macro also. Is there anyway to resolve this? or what is the correct way to convert LPTSTR to BSTR? Thanks in advance.

    Regards, Bala

    R T C 3 Replies Last reply
    0
    • B balakrishnan vinchu

      In my project i am using FormatMessage API which is returning the LPTSTR buffer pointer lpMsgBuf, if i use CComBstr Message(lpMsgBuf); to copy the lpMsgBuf to BSTR. But this conversion shows memory leak. I am using LocalFree(lpMsgBuf); to release the lpMsgBuf. I am using USES_CONVERSION macro also. Is there anyway to resolve this? or what is the correct way to convert LPTSTR to BSTR? Thanks in advance.

      Regards, Bala

      R Offline
      R Offline
      Rajkumar R
      wrote on last edited by
      #2

      May be posting the code snippet helps, one possible leak in using CComBSTR is "Passing the address of an initialized CComBSTR to a function as an [out] parameter causes a memory leak." from msdn.

      1 Reply Last reply
      0
      • B balakrishnan vinchu

        In my project i am using FormatMessage API which is returning the LPTSTR buffer pointer lpMsgBuf, if i use CComBstr Message(lpMsgBuf); to copy the lpMsgBuf to BSTR. But this conversion shows memory leak. I am using LocalFree(lpMsgBuf); to release the lpMsgBuf. I am using USES_CONVERSION macro also. Is there anyway to resolve this? or what is the correct way to convert LPTSTR to BSTR? Thanks in advance.

        Regards, Bala

        T Offline
        T Offline
        ThatsAlok
        wrote on last edited by
        #3

        try _bstr_t

        "Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
        Never mind - my own stupidity is the source of every "problem" - Mixture

        cheers, Alok Gupta VC Forum Q&A :- I/IV Support CRY- Child Relief and You/codeProject$$>

        1 Reply Last reply
        0
        • B balakrishnan vinchu

          In my project i am using FormatMessage API which is returning the LPTSTR buffer pointer lpMsgBuf, if i use CComBstr Message(lpMsgBuf); to copy the lpMsgBuf to BSTR. But this conversion shows memory leak. I am using LocalFree(lpMsgBuf); to release the lpMsgBuf. I am using USES_CONVERSION macro also. Is there anyway to resolve this? or what is the correct way to convert LPTSTR to BSTR? Thanks in advance.

          Regards, Bala

          C Offline
          C Offline
          CPallini
          wrote on last edited by
          #4

          Probably posting your code will help. :)

          If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
          This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke

          B 1 Reply Last reply
          0
          • C CPallini

            Probably posting your code will help. :)

            If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
            This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke

            B Offline
            B Offline
            balakrishnan vinchu
            wrote on last edited by
            #5

            Here is my code: //Functions used to report the Error STDMETHODIMP CVBErrAgent::ReportError(IErrMsg *pErrMsg, SAFEARRAY** args) { //CCOmBstr variables for unformatted and formatted message CComBSTR formatstring, message; pErrMsg->get_ErrMsg(&formatstring); //Function to format the message. This function uses FormatMessage API to get formatted string. FormatMessageFromString(formatstring, args, &message); pErrMsg->put_ErrMsg(message); tlErrorBehavior behav; pErrMsg->get_Behavior(&behav); if(behav != tlErrorIgnore) return CErrSvcClientImpl::tl_Error(pErrMsg); return S_FALSE; } HRESULT CVBErrAgent::FormatMessageFromString(BSTR formatstring, SAFEARRAY **args, BSTR *outputstring) { std::vector vecargs; VARIANT HUGEP * pvar; long lbound, ubound, elcount; //Codes to read SAFEARRAY and creates the argsarray vector, this will be passed to FormatMessage API. if (FAILED (SafeArrayGetLBound(*args, 1, &lbound)) || FAILED (SafeArrayGetUBound(*args, 1, &ubound))) return E_INVALIDARG; elcount = ubound - lbound + 1; if(elcount == 1) { SafeArrayAccessData(*args, (void HUGEP **)&pvar); //If the SAFEARRAY consists of a single VARIANT that is of type VT_ARRAY then //We want to call SafeArrayToVector using the embedded array. if(pvar[0].vt & VT_ARRAY) { SafeArrayToVector(pvar->parray, vecargs); } else SafeArrayToVector(*args, vecargs); SafeArrayUnaccessData(*args); } else SafeArrayToVector(*args, vecargs); std::vector::iterator it; int count = vecargs.size(); vector argsarray(count); USES_CONVERSION; for(it = vecargs.begin(), count = 0; it != vecargs.end(); it++, count++) { if((*it).vt & VT_BSTR) { if((*it).vt & VT_BYREF) argsarray[count] = reinterpret_cast(OLE2T(*(*it).pbstrVal)); else argsarray[count] = reinterpret_cast(OLE2T((*it).bstrVal)); } else if((*it).vt & VT_I4 || (*it).vt & VT_I2) { if((*it).vt & VT_BYREF) argsarray[count] = reinterpret_cast(*(*it).plVal); else argsarray[count] = reinterpret_cast((*it).lVal); } } LPTSTR lpMsgBuf; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] ); i

            C R 2 Replies Last reply
            0
            • B balakrishnan vinchu

              Here is my code: //Functions used to report the Error STDMETHODIMP CVBErrAgent::ReportError(IErrMsg *pErrMsg, SAFEARRAY** args) { //CCOmBstr variables for unformatted and formatted message CComBSTR formatstring, message; pErrMsg->get_ErrMsg(&formatstring); //Function to format the message. This function uses FormatMessage API to get formatted string. FormatMessageFromString(formatstring, args, &message); pErrMsg->put_ErrMsg(message); tlErrorBehavior behav; pErrMsg->get_Behavior(&behav); if(behav != tlErrorIgnore) return CErrSvcClientImpl::tl_Error(pErrMsg); return S_FALSE; } HRESULT CVBErrAgent::FormatMessageFromString(BSTR formatstring, SAFEARRAY **args, BSTR *outputstring) { std::vector vecargs; VARIANT HUGEP * pvar; long lbound, ubound, elcount; //Codes to read SAFEARRAY and creates the argsarray vector, this will be passed to FormatMessage API. if (FAILED (SafeArrayGetLBound(*args, 1, &lbound)) || FAILED (SafeArrayGetUBound(*args, 1, &ubound))) return E_INVALIDARG; elcount = ubound - lbound + 1; if(elcount == 1) { SafeArrayAccessData(*args, (void HUGEP **)&pvar); //If the SAFEARRAY consists of a single VARIANT that is of type VT_ARRAY then //We want to call SafeArrayToVector using the embedded array. if(pvar[0].vt & VT_ARRAY) { SafeArrayToVector(pvar->parray, vecargs); } else SafeArrayToVector(*args, vecargs); SafeArrayUnaccessData(*args); } else SafeArrayToVector(*args, vecargs); std::vector::iterator it; int count = vecargs.size(); vector argsarray(count); USES_CONVERSION; for(it = vecargs.begin(), count = 0; it != vecargs.end(); it++, count++) { if((*it).vt & VT_BSTR) { if((*it).vt & VT_BYREF) argsarray[count] = reinterpret_cast(OLE2T(*(*it).pbstrVal)); else argsarray[count] = reinterpret_cast(OLE2T((*it).bstrVal)); } else if((*it).vt & VT_I4 || (*it).vt & VT_I2) { if((*it).vt & VT_BYREF) argsarray[count] = reinterpret_cast(*(*it).plVal); else argsarray[count] = reinterpret_cast((*it).lVal); } } LPTSTR lpMsgBuf; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] ); i

              C Offline
              C Offline
              CPallini
              wrote on last edited by
              #6

              In your FormatMessage call

              balakrishnan vinchu wrote:

              retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] );

              The line

              (LPTSTR) &lpMsgBuf,

              is wrong. It should be simply

              lpMsgBuf,
              Forget it. :)

              If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
              This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke

              modified on Wednesday, May 7, 2008 5:40 AM

              B 1 Reply Last reply
              0
              • C CPallini

                In your FormatMessage call

                balakrishnan vinchu wrote:

                retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] );

                The line

                (LPTSTR) &lpMsgBuf,

                is wrong. It should be simply

                lpMsgBuf,
                Forget it. :)

                If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
                This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke

                modified on Wednesday, May 7, 2008 5:40 AM

                B Offline
                B Offline
                balakrishnan vinchu
                wrote on last edited by
                #7

                I changed my code as you explained in previous mail. LPTSTR lpMsgBuf = NULL; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, lpMsgBuf, // Suggested to pass simply lpMsgBug 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message(lpMsgBuf); *outputstring = message.Detach(); LocalFree(lpMsgBuf); Now i am not getting the Formatted message, since retval returned from FormatMessgae API is zero (i.e 0), Because of this CComBSTR message didn't created. Also if i wont initialize lpMsgBuf = NULL, then functions just gives exception. Give me some suggestion. Thanks

                Regards, Bala

                M B C 3 Replies Last reply
                0
                • B balakrishnan vinchu

                  I changed my code as you explained in previous mail. LPTSTR lpMsgBuf = NULL; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, lpMsgBuf, // Suggested to pass simply lpMsgBug 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message(lpMsgBuf); *outputstring = message.Detach(); LocalFree(lpMsgBuf); Now i am not getting the Formatted message, since retval returned from FormatMessgae API is zero (i.e 0), Because of this CComBSTR message didn't created. Also if i wont initialize lpMsgBuf = NULL, then functions just gives exception. Give me some suggestion. Thanks

                  Regards, Bala

                  M Offline
                  M Offline
                  Mukesh Kumar
                  wrote on last edited by
                  #8

                  Once try this initialize lpMsgBuf as: LPVOID lpMsgBuf; and inside FormatMessage write lpMsgBuf as: (LPTSTR) &lpMsgBuf,

                  Mukesh Kumar Software Engineer

                  1 Reply Last reply
                  0
                  • B balakrishnan vinchu

                    Here is my code: //Functions used to report the Error STDMETHODIMP CVBErrAgent::ReportError(IErrMsg *pErrMsg, SAFEARRAY** args) { //CCOmBstr variables for unformatted and formatted message CComBSTR formatstring, message; pErrMsg->get_ErrMsg(&formatstring); //Function to format the message. This function uses FormatMessage API to get formatted string. FormatMessageFromString(formatstring, args, &message); pErrMsg->put_ErrMsg(message); tlErrorBehavior behav; pErrMsg->get_Behavior(&behav); if(behav != tlErrorIgnore) return CErrSvcClientImpl::tl_Error(pErrMsg); return S_FALSE; } HRESULT CVBErrAgent::FormatMessageFromString(BSTR formatstring, SAFEARRAY **args, BSTR *outputstring) { std::vector vecargs; VARIANT HUGEP * pvar; long lbound, ubound, elcount; //Codes to read SAFEARRAY and creates the argsarray vector, this will be passed to FormatMessage API. if (FAILED (SafeArrayGetLBound(*args, 1, &lbound)) || FAILED (SafeArrayGetUBound(*args, 1, &ubound))) return E_INVALIDARG; elcount = ubound - lbound + 1; if(elcount == 1) { SafeArrayAccessData(*args, (void HUGEP **)&pvar); //If the SAFEARRAY consists of a single VARIANT that is of type VT_ARRAY then //We want to call SafeArrayToVector using the embedded array. if(pvar[0].vt & VT_ARRAY) { SafeArrayToVector(pvar->parray, vecargs); } else SafeArrayToVector(*args, vecargs); SafeArrayUnaccessData(*args); } else SafeArrayToVector(*args, vecargs); std::vector::iterator it; int count = vecargs.size(); vector argsarray(count); USES_CONVERSION; for(it = vecargs.begin(), count = 0; it != vecargs.end(); it++, count++) { if((*it).vt & VT_BSTR) { if((*it).vt & VT_BYREF) argsarray[count] = reinterpret_cast(OLE2T(*(*it).pbstrVal)); else argsarray[count] = reinterpret_cast(OLE2T((*it).bstrVal)); } else if((*it).vt & VT_I4 || (*it).vt & VT_I2) { if((*it).vt & VT_BYREF) argsarray[count] = reinterpret_cast(*(*it).plVal); else argsarray[count] = reinterpret_cast((*it).lVal); } } LPTSTR lpMsgBuf; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] ); i

                    R Offline
                    R Offline
                    Rajkumar R
                    wrote on last edited by
                    #9

                    balakrishnan vinchu wrote:

                    *outputstring = message.Detach();

                    you already taken the ownership of the BSTR, created and associated with the CComBSTR, by Detach method; hence CComBSTR is not expected to release the BSTR. If you are expecting so then you are not supposed to return that buffer as out parameter (outputstring). this outputstring is not released and i think, so the tool you used to detect memory leak points to the creator of it, CComBSTR message(lpMsgBuf);.

                    B 1 Reply Last reply
                    0
                    • B balakrishnan vinchu

                      I changed my code as you explained in previous mail. LPTSTR lpMsgBuf = NULL; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, lpMsgBuf, // Suggested to pass simply lpMsgBug 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message(lpMsgBuf); *outputstring = message.Detach(); LocalFree(lpMsgBuf); Now i am not getting the Formatted message, since retval returned from FormatMessgae API is zero (i.e 0), Because of this CComBSTR message didn't created. Also if i wont initialize lpMsgBuf = NULL, then functions just gives exception. Give me some suggestion. Thanks

                      Regards, Bala

                      B Offline
                      B Offline
                      balakrishnan vinchu
                      wrote on last edited by
                      #10

                      Is this the right way? LPVOID lpMsgBuf; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message; message = T2OLE(LPTSTR(lpMsgBuf)); message.CopyTo(outputstring); I modified LPTSTR lpMsgBuf; to LPVOID lpMsgBuf; And converted LPTSTR to LPOLESTR. Am i doing correct here? :-)

                      Regards, Bala

                      M 1 Reply Last reply
                      0
                      • B balakrishnan vinchu

                        I changed my code as you explained in previous mail. LPTSTR lpMsgBuf = NULL; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, lpMsgBuf, // Suggested to pass simply lpMsgBug 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message(lpMsgBuf); *outputstring = message.Detach(); LocalFree(lpMsgBuf); Now i am not getting the Formatted message, since retval returned from FormatMessgae API is zero (i.e 0), Because of this CComBSTR message didn't created. Also if i wont initialize lpMsgBuf = NULL, then functions just gives exception. Give me some suggestion. Thanks

                        Regards, Bala

                        C Offline
                        C Offline
                        CPallini
                        wrote on last edited by
                        #11

                        You're right (and I was wrong...). Whenever you use FORMAT_MESSAGE_ALLOCATE_BUFFER you have to pass the address of the variable, hence your code was correct. :)

                        If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
                        This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke

                        1 Reply Last reply
                        0
                        • R Rajkumar R

                          balakrishnan vinchu wrote:

                          *outputstring = message.Detach();

                          you already taken the ownership of the BSTR, created and associated with the CComBSTR, by Detach method; hence CComBSTR is not expected to release the BSTR. If you are expecting so then you are not supposed to return that buffer as out parameter (outputstring). this outputstring is not released and i think, so the tool you used to detect memory leak points to the creator of it, CComBSTR message(lpMsgBuf);.

                          B Offline
                          B Offline
                          balakrishnan vinchu
                          wrote on last edited by
                          #12

                          Is this the right way? LPVOID lpMsgBuf; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message; message = T2OLE(LPTSTR(lpMsgBuf)); message.CopyTo(outputstring); I modified LPTSTR lpMsgBuf; to LPVOID lpMsgBuf; And converted LPTSTR to LPOLESTR. Am i doing correct here? [Smile]

                          Regards, Bala

                          R 1 Reply Last reply
                          0
                          • B balakrishnan vinchu

                            Is this the right way? LPVOID lpMsgBuf; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message; message = T2OLE(LPTSTR(lpMsgBuf)); message.CopyTo(outputstring); I modified LPTSTR lpMsgBuf; to LPVOID lpMsgBuf; And converted LPTSTR to LPOLESTR. Am i doing correct here? :-)

                            Regards, Bala

                            M Offline
                            M Offline
                            Mukesh Kumar
                            wrote on last edited by
                            #13

                            Is this working correctly now? :)

                            Mukesh Kumar Software Engineer

                            1 Reply Last reply
                            0
                            • B balakrishnan vinchu

                              Is this the right way? LPVOID lpMsgBuf; DWORD messageflags = FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY ; DWORD retval; //Format the message from the format string. retval = FormatMessage( messageflags, OLE2T(formatstring), NULL, LANG_SYSTEM_DEFAULT, (LPTSTR) &lpMsgBuf, 0, (va_list*)&argsarray[0] ); if (!retval) return MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, GetLastError()); CComBSTR message; message = T2OLE(LPTSTR(lpMsgBuf)); message.CopyTo(outputstring); I modified LPTSTR lpMsgBuf; to LPVOID lpMsgBuf; And converted LPTSTR to LPOLESTR. Am i doing correct here? [Smile]

                              Regards, Bala

                              R Offline
                              R Offline
                              Rajkumar R
                              wrote on last edited by
                              #14

                              the question is not about "message" variable how you clean up "outputstring" variable.

                              1 Reply Last reply
                              0
                              Reply
                              • Reply as topic
                              Log in to reply
                              • Oldest to Newest
                              • Newest to Oldest
                              • Most Votes


                              • Login

                              • Don't have an account? Register

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • World
                              • Users
                              • Groups