Не свободный, но с последним Office существует очень хорошая автоматизация.Net API. (был API долгое время, но был противным COM), можно сделать все, что Вы хотите / потребность в коде все, в то время как приложение Office остается скрытым фоновым процессом.
В 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...
Если я правильно понимаю, ваш прототип функции также должен быть stdcall.
function Setup(ip, port: PChar):Integer: virtual; stdcall; abstract;
ps. Строки Delphi уже оканчиваются нулем.
Является ли char одинаковым размером в обоих компиляторах? Если вы используете D2009 / D2010, char теперь 16-битный.