Импорт функции из библиотеки на Delphi - C#
Формулировка задачи:
Добрый день
есть библиотека написанная на делфи
в ней функция
объявляю функцию в классах
далее по кнопке пытаюсь получить данные
помогите как правильно написать взаимодействие с библиотекой.
выходит исключение попытка чтения или записи в защищенную память если закоментить первый маршалинг то исключения нет но и функция в буфере выводит инфу в кодировке IBM866 "connect 1. Error=10051 Network is unreachable" это похоже означает что Ip адрес с портом не соответствует ожиданию.
function CallXMLRPC2(AddressName: PChar; имя сервера ConnectName:PChar; имя соединения может быть пустым Request: PChar; запрос RequestSize: integer;длина запроса var RequestNum: DWord; номер запроса //в обе стороны. Если 0, то генерируется сервером. ResultFile: PChar; файл результата ErrorBuf: PChar; буфер для передачи ошибки ErrorBufSize: integer объем буфера ):BOOL;stdcall;
[DllImport("XML.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Auto)]
private static extern bool CallXMLRPC2(
string ip, //адрес подключения
string connectid, //айди подключения
string zap, //строка запроса
int length_zap, //длинна запроса
int zapnum, //номер запроса передавать пусто или 0
string resfile, // путь с файлом куда писать результат
StringBuilder buf,
int sizebuf
); private void button1_Click(object sender, EventArgs e)
{
var ip = "127.0.0.1:2455";
var zap =@" <?xml version=""1.0"" encoding=""utf-8"" ?>
<Query>
<CMD CMD=""GetData"" Name=""Items"" WithMacroProp=""1"" />
</Query>";
var lenzap = zap.Length;
var res ="11.xml";
var zapnm = 0 ;
var bu = new StringBuilder(1024);
var result= CallXMLRPC2(ip,
"",
zap,
lenzap,
zapnm,
res,
bu,
bu.Capacity);
if (result != true)
{textBox1.Text = ip+"\r\n "+zap1+"\r\n "+lenzap+"\r\n "+zapnm+"\r\n "+res+"\r\n "+bu.ToString()+"\r\n "+result.ToString();}
}
переделал объявление
[DllImport("XML.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Auto)]
private static extern bool CallXMLRPC2(
[MarshalAs(UnmanagedType.LPStr)]
string ip, //адрес подключения
[MarshalAs(UnmanagedType.LPStr)]
string connectid, //айди подключения
[MarshalAs(UnmanagedType.LPStr)]
string zap, //строка запроса
int length_zap, //длинна запроса
int zapnum, //номер запроса передавать пусто или 0
[MarshalAs(UnmanagedType.LPStr)]
string resfile, // путь с файлом куда писать результат
StringBuilder buf,
int sizebuf
);Решение задачи: «Импорт функции из библиотеки на Delphi»
textual
Листинг программы
[DllImport("XML.dll", CharSet = CharSet.Ansi)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CallXMLRPC2(
string AddressName,
string ConnectName,
string Request,
int RequestSize,
ref uint RequestNum,
string ResultFile,
StringBuilder ErrorBuf,
int ErrorBufSize
);