10
char cmd[40];
driver = FuncGetDrive(driver);
sprintf_s(cmd, "%c:\\test.exe", driver);

I cannot use cmd in

sei.lpFile = cmad;

so, how to convert char array to wchar_t array ?

Donald Duck
  • 8,409
  • 22
  • 75
  • 99
pradeep
  • 3,005
  • 12
  • 42
  • 65

3 Answers3

23

Just use this:

static wchar_t* charToWChar(const char* text)
{
    const size_t size = strlen(text) + 1;
    wchar_t* wText = new wchar_t[size];
    mbstowcs(wText, text, size);
    return wText;
}

Don't forget to call delete [] wCharPtr on the return result when you're done, otherwise this is a memory leak waiting to happen if you keep calling this without clean-up. Or use a smart pointer like the below commenter suggests.

Or use standard strings, like as follows:

#include <cstdlib>
#include <cstring>
#include <string>

static std::wstring charToWString(const char* text)
{
    const size_t size = std::strlen(text);
    std::wstring wstr;
    if (size > 0) {
        wstr.resize(size);
        std::mbstowcs(&wstr[0], text, size);
    }
    return wstr;
}
leetNightshade
  • 2,673
  • 2
  • 36
  • 47
  • 2
    If you use `std::unique_ptr wa(new wchar_t[size])` you won't have to manually delete it later. – a paid nerd Jun 02 '15 at 21:21
  • 2
    Since wchar_t already has a standard resource manager with std::wstring, it can be used instead of a smart pointer, too. – Robert Aug 02 '16 at 09:51
16

From MSDN:

#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;
using namespace System;

int main()
{
    char *orig = "Hello, World!";
    cout << orig << " (char *)" << endl;

    // Convert to a wchar_t*
    size_t origsize = strlen(orig) + 1;
    const size_t newsize = 100;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE);
    wcscat_s(wcstring, L" (wchar_t *)");
    wcout << wcstring << endl;
}
Georg Fritzsche
  • 97,545
  • 26
  • 194
  • 236
Traveling Tech Guy
  • 27,194
  • 23
  • 111
  • 159
0

From your example using swprintf_s would work

wchar_t wcmd[40];
driver = FuncGetDrive(driver);
swprintf_s(wcmd, "%C:\\test.exe", driver);

Note the C in %C has to be written with uppercase since driver is a normal char and not a wchar_t.
Passing your string to swprintf_s(wcmd,"%S",cmd) should also work

josefx
  • 15,506
  • 6
  • 38
  • 63