[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 624
  • Last Modified:

Converting a CString into an Array

Hi guys,

I have this line of code:

CString cszArg2= pDispParams->rgvarg[0].bstrVal;


But instead of storing a CString, I am looking to store an array. Any ideas on what I need to do to get this working? This is partially related to another question I have open, but is not the same question.

Cheers!
0
Cyber-Drugs
Asked:
Cyber-Drugs
  • 3
  • 2
  • 2
  • +4
3 Solutions
 
Alkali_GuyCommented:
std::auto_ptr<char> cszArg2(new char[SysStringByteLen(pDispParams->rgvarg[0].bstrVal)]);
memcpy(cszArg2.get(), pDispParams->rgvarg[0].bstrVal, sizeof(cszArg2.get()));
0
 
Cyber-DrugsAuthor Commented:
Hi,

Unfortunately I got an error with that one:

C:\Documents and Settings\Administrator\Desktop\Browser\CustomBrowser\CustomBrowser\Idispimp.cpp(383) : error C2039: 'auto_ptr' : is not a member of 'std'


If it at all helps, full details of the function this belongs to can be found here:

http://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_22067364.html

Cheers!
0
 
jkrCommented:
See http://www.codeproject.com/string/ctokenex.asp ("String Tokenizer Class (CTokenEx)"), this one will help you to break a string down into an array. But, since you deal with filenames, that might be problematic depending on the which delimiter tokens you use.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
puranik_pCommented:
CString strText = "Puranik";
char * chText = strText.GetBuffer(1);
0
 
mahesh1402Commented:
You may use OLE2CA

#include <atlconv.h> // or <afxpriv.h>

USES_CONVERSION; // Necessary when you use these OLE macros

const char *pString1 = OLE2CA(YourBSTR); // Macro converts OLECHAR string to "const char *" string


So you may directly try :
      const char *pString = OLE2CA(pDispParams->rgvarg[0].bstrVal);

-MAHESH
0
 
Alkali_GuyCommented:
std::auto_ptr requires
#include <memory>
but you could use a regular pointer instead as long as you call delete.

But certainly as Mahesh suggests, there is no need to copy the string necessarily.
0
 
AndyAinscowCommented:
Is CStringArray any use?
0
 
itsmeandnobodyelseCommented:
To convert a CString to a CStringArray you may use that:

int StringToArray(const CString& str, CStringArray& arr, const CString& seps = " ")
{
    int last = 0;

    for (int i = 0; i < str.GetLength(); ++i)
    {
        TCHAR c = str[i];
        if (seps.Find(c) >= 0)
        {
            arr.Add(str.Mid(last, i-last));
            last = i+1;
        }
    }
    return arr.GetSize();
}

It can be used like:

    CString str = "abc;def;xyz;;mkh;";
    CStringArray arr;
    int n = StringToArray(str, arr, ";");

    for (int ii=0; ii < arr.GetSize(); ++ii)
        AfxMessageBox(arr.GetAt(ii));

Note, if your string contains more than one valid separator, e. g. space, comma, and semicolon, you may pass it to the convert function like " ,;".

Regards, Alex


0
 
Cyber-DrugsAuthor Commented:
Hi guys,

I ended up making a function to solve this, here is what I got:

CString* CCustomBrowserDlg::CB_GetArray(VARIANT vMyValue, int nArg2)
{
      CString* aEndArray = new CString[nArg2];
      int pos = 1;
      CComPtr<IDispatchEx> pDispEx;
      HRESULT hr=vMyValue.pdispVal->QueryInterface(IID_IDispatchEx,(void**)&pDispEx);
      DISPID dispid;
      // get the DISPID of the first item.  
      hr = pDispEx->GetNextDispID(fdexEnumAll, DISPID_STARTENUM, &dispid);
      while (hr == NOERROR)
      {
            // get the item name
            CComBSTR bstrName;
            hr = pDispEx->GetMemberName(dispid, &bstrName);

            // get the item value
            CComVariant vValue;
            DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
            hr = pDispEx->InvokeEx(dispid, LOCALE_USER_DEFAULT,
                  DISPATCH_PROPERTYGET, &dispparamsNoArgs,
                  &vValue, NULL, NULL);

            if (pos <= nArg2)
            {
                  switch (vValue.vt)
                  {
                  case VT_I4:
                        // value is integer
                        char buf[5];
                        itoa(vValue.iVal, buf, 10);
                        aEndArray[pos-1] = buf;
                        break;
                  case VT_BSTR:
                        // value is string
                        aEndArray[pos-1] = vValue.bstrVal;
                        break;
                  }
            }

            pos++;
            //get the DISPID of the next item.  
            hr = pDispEx->GetNextDispID(fdexEnumAll, dispid, &dispid);
      }

      return aEndArray;
}
0
 
itsmeandnobodyelseCommented:
>>>> CString cszArg2= pDispParams->rgvarg[0].bstrVal;

I am missing a statement like the one you initially asked for.

Did you change your requirement? Did the last function you posted solve your problem?

>>>> CString* CCustomBrowserDlg::CB_GetArray(VARIANT vMyValue, int nArg2)

Instead of returning a CString* I would suggest to pass a reference to a CStringArray.

  bool CCustomBrowserDlg::CB_GetArray(VARIANT vMyValue, int nArg2, CStringArray& aEndArray)

Then, you don't need to allocate an array yourself but simply call aEndArray.Add(..) to add a new CString to the array, e. g.

    aEndArray.Add(CString( vValue.bstrVal ));


Regards, Alex
0
 
mahesh1402Commented:
Have you tried that with OLE2CA as shown above ?
0
 
Cyber-DrugsAuthor Commented:
itsmeandnobodyelse,

>>>> CString cszArg2= pDispParams->rgvarg[0].bstrVal;

has not disappeared, I merely parse that value into the function above, and it outputs an array for me.



mahesh1402,

I will be trying the other methods once I finish off a few bits of work in the office, and then will get back to you on the results, but wanted to let you all know that it's no longer urgent, as I have a working solution. :)


Cheers!
0
 
puranik_pCommented:
You can use the same thing.
CString cszArg2= pDispParams->rgvarg[0].bstrVal;

After this
cszArg2.GetBuffer(1) will return an array.

0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 3
  • 2
  • 2
  • +4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now