Delphi PChar к символу константы C++*

Не свободный, но с последним Office существует очень хорошая автоматизация.Net API. (был API долгое время, но был противным COM), можно сделать все, что Вы хотите / потребность в коде все, в то время как приложение Office остается скрытым фоновым процессом.

7
задан rptony 9 September 2009 в 10:16
поделиться

3 ответа

В Delphi 2010 (и Delphi 2009) тип char на самом деле является WIDEChar, то есть шириной 16 бит. Поэтому, когда вы вызываете свою функцию C ++, если она ожидает, что CHAR будет иметь ширину 8 бит (так называемый «ANSI», а не UNICODE), то он неправильно интерпретирует входной параметр.

например, если вы передадите строку 'ABC' # 0 (я показываю нулевой терминатор явно, но это просто неявная часть строки в Delphi, и ее не нужно добавлять специально) это передает указатель на 8 последовательность байтов , НЕ 4 байта!

Но поскольку 3 символа в вашей строке имеют только 8-битные значения кодовой точки (в терминах Unicode, это означает, что код C ++ "видит "- это строка, которая выглядит так: показано преобразование строк в ANSIString перед вызовом функции - компилятор может позаботиться об этом за вас, но вы можете счесть полезным внести ясность в свой код, а не полагаться на «магию компилятора»:

  var
    sIPAddress: ANSIString;
    sPort: ANSIString;
  begin   
    sIPAddress := '192.168.1.100';
    sPort      := '97777';

    pObj.Setup(sIPAddress, sPort);

    // etc... 
18
ответ дан 6 December 2019 в 07:07
поделиться

Если я правильно понимаю, ваш прототип функции также должен быть stdcall.

function Setup(ip, port: PChar):Integer: virtual; stdcall; abstract;

ps. Строки Delphi уже оканчиваются нулем.

3
ответ дан 6 December 2019 в 07:07
поделиться

Является ли char одинаковым размером в обоих компиляторах? Если вы используете D2009 / D2010, char теперь 16-битный.

4
ответ дан 6 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

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