Как установить указатель LPWSTR, который был предоставлен ссылкой на функцию? - PullRequest
0 голосов
/ 29 января 2019

Я заменяю старую DLL, которая имеет функцию, передавая LPWSTR по ссылке.Функции должны создать новый буфер wchar и вернуть вновь созданный указатель LPWSTR.Я нашел решение, но я думаю, что это можно решить лучше!?

По основной программе функция DLL называется так:

LPWSTR data = null;
funcA(&data);

Функция должна создать новый буфер wcharи вернуть адрес.

Итак, вот что я делаю (это работает):

void funcA(LPWSTR szData)
{
  LPWSTR newData = L"DEMODATA";
  LPWSTR newBuffer = new TCHAR[9];
  wmemcpy(newBuffer, newData, 9);

  memcpy(szData, (LPWSTR)&newBuffer , sizeof(LPWSTR));  
}

Можно ли написать последнюю строку лучше читаемой?Я попытался назначить новый указатель, но это не работает:

szData = (LPWSTR)&newBuffer; // not working!

Ответы [ 3 ]

0 голосов
/ 29 января 2019
memcpy(szData, (LPWSTR)&newBuffer , sizeof(LPWSTR));  

эквивалентно

*(LPWSTR*)szData = newBuffer; //this copies into the address pointed to by szData

, а не

szData = (LPWSTR)&newBuffer; // this copies into szData
0 голосов
/ 29 января 2019

передача LPWSTR по ссылке

Но вы этого не делаете ...

void funcA(wchar_t* data); // LPWSTR resolved to what it actually is
                           // using correct pointers illustrates better
                           // than Microsoft's (valueless?) pointer typedefs...

Исходный указатель, который вы передаете, скопирован в аргумент функции, затем происходит присвоение этой копии.

Вам действительно нужно иметь возможность назначить внешний адрес, поэтому вам нужно сделать то, что вы уже описали:

void funcA(wchar_t*& data); // reference to pointer
//                 ^ (!)
{
    wchar_t const* newData = L"DEMODATA"; // literals are const!
    data = new wchar_t[9]; // you can assign directly (especially: no need for memcpy)
    wmemcpy(data, newData, 9);
}

Просто для дальнейшей иллюстрации, может помочь лучше понять: указатель стиля C на указатель:

void funcA(wchar_t** data); // pointer to pointer
//                 ^
{
    wchar_t* newData = new wchar_t[9];
    wmemcpy(newData, L"DEMODATA", 9);
    *data = newData;
//  ^ (!)
};

Использование этого варианта:

wchar_t* text;
funcA(&text);
//    ^ (!)
0 голосов
/ 29 января 2019

Функция должна создать новый буфер wchar и вернуть адрес.

Затем просто сделайте это:

LPWSTR funcA() {
  LPWSTR newData = L"DEMODATA";
  LPWSTR newBuffer = new TCHAR[9];
  wmemcpy(newBuffer, newData, 9);

  return newBuffer;
}

LPWSTR data = funcA();

С учетом сказанного рассмотрите возможность использования unique_ptr хранить собственные указатели.Это будет работать, но это плохая практика.Более того, используйте std::string для обработки данных и конвертируйте в указатели WinAPI только при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...