@Zaher220
Software developer

Как инициализировать строку PCHAR в с++?

Здравствуйте.
Делаю программу с использованием фреймворка Qt5.4. Использую стороннюю библиотеку написанную на delphi. Одна из функций принимает тип PCHAR. У меня не получается создать и инициализировать переменную типа PCHAR. Для создания нужной строки использовал различные способы

char ss[]="usb3000";
char *s = ss;
PCHAR* p =reinterpret_cast<PCHAR*>(s);


PCHAR tx[]={{'u'},{'s'},{'b'},{'3'},{'0'},{'0'},{'0'}};

PCHAR tx[]=L"usb3000";

Не один из вышеприведённых вариантов корректно не отработал. Первый вывалился c segmentation fault при вызове функции из библиотеки. На остальные ругается компилятор.
  • Вопрос задан
  • 1111 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Sumor
Точно вам никто не скажет - нужно экспериментировать.
Варианты следующие:
В дельфи ожидается не обычный PChar, а свой собственный String или AnsiString, который подразумевает в первом байте или двух байтах размер строки. Вы передаёте там символ, который заведомо больше размера строки и дельфи читает лишнюю память и падает.
Менее вероятные варианты - ожидается юникод, или у вас получается юникод.
Ответ написан
Комментировать
@DISaccount
PChar - это уже указатель. Поэтому у Вас должен быть такой typedef:

typedef char* PCHAR;
...........

char ss[]="usb3000";
PCHAR p =reinterpret_cast<PCHAR>(ss);
Ответ написан
Комментировать
@to_climb
Как уже написали, segmentation fault - выход за границы отведённой памяти. Наверняка функция что-то пишет в эту строку (хотя может и читать за её границей, но менее вероятно - ноль на конце всё-таки). Рецепт прост - нужно понять, какого размера строка ожидается и выделять нужный размер по new. Частая практика - передавать сначала NULL вместо буфера, чтобы функция вернула ожидаемый нужный размер.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
1. Что принимает система: PCHAR или PCHAR*?
2. Если версии Delphi достаточно новые, PCHAR — это, скорее всего, wchar_t* и надо просто передавать «широкую» строчку L"usb3000".
3. Постарайся, чтобы reinterpret_cast не было; это признак того, что ты делаешь что-то неверно. Единственное, где он в подобных API допустим — это в callback’ах для передачи замыкания (информации о том, какая подпрограмма и при каких обстоятельствах запустила функцию, вызвавшую callback). P.S. Надумал и второе назначение reinterpret_cast — функция, которая может принимать данные разных типов (вроде SendMessage из Win32).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы