Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351

Импорт функции из библиотеки на Delphi

18.09.2014, 22:39. Показов 3323. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день
есть библиотека написанная на делфи
в ней функция
Delphi
1
2
3
4
5
6
7
8
9
function CallXMLRPC2(AddressName: PChar; имя сервера
 ConnectName:PChar; имя соединения может быть пустым
  Request: PChar; запрос 
RequestSize: integer;длина запроса
  var RequestNum: DWord; номер запроса //в обе стороны. Если 0, то генерируется сервером.
  ResultFile: PChar; файл результата
  ErrorBuf: PChar; буфер для передачи ошибки
ErrorBufSize: integer объем буфера
):BOOL;stdcall;
объявляю функцию в классах
C#
1
2
3
4
5
6
7
8
9
10
11
12
[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
            );
далее по кнопке пытаюсь получить данные

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 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();}
               }
помогите как правильно написать взаимодействие с библиотекой.

Добавлено через 6 часов 25 минут
переделал объявление
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[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
            );
выходит исключение попытка чтения или записи в защищенную память если закоментить первый маршалинг то исключения нет но и функция в буфере выводит инфу в кодировке IBM866 "connect 1. Error=10051 Network is unreachable" это похоже означает что Ip адрес с портом не соответствует ожиданию.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.09.2014, 22:39
Ответы с готовыми решениями:

Импорт библиотеки из С++ на С#
Добрый день, коллеги. Требуется небольшая помощь. Имеется библиотека написанная на С++, требуется использовать ее в проекте на С#. ...

Импорт библиотеки
Всем привет! Приложил снимок консоли. Подскажите пожалуйста в чем может быть проблема? Установку сделал все как тут...

Импорт библиотеки в MVS
Здравствуйте! Нужна небольшая помощь знающих! Скачал библиотеку cURL (работа с сетью и вебом), применив которую в своем коде получаю...

13
871 / 721 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
19.09.2014, 00:02
Andreyip,
Попробуйте вместо String использовать StringBuilder
1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.09.2014, 00:05
Лучший ответ Сообщение было отмечено Andreyip как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
[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
    );
Пробуйте.
1
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
19.09.2014, 00:25  [ТС]
напишите примерный код
я пробовал так
var ip = "127.0.0.1:2455";
var ip1 = new StringBuilder();
var ip2=ip1.Append(ip);
ну и в запросе айпи равен ip2.Tostring()

NickoTin,
Добавлено через 9 минут
Спасибо, сработало, объясните пожалуйста почему именно такая структура, и как прочитать данные в читабельном формате при ошибке из буфера, они там были в кодировке Ibm866(.
кстати я тоже сомневался насчет ReguestNum int или uint выбирать.

Добавлено через 8 минут
NickoTin,
Delphi
1
2
3
4
5
function CallXMLRPCToStream2(AddressName: PChar; ConnectName,
  Request: PChar; RequestSize: integer;
  var RequestNum: DWord; //в обе стороны. Если 0, то генерируется сервером.
  ResultStream: IStream;
  ErrorBuf: PChar; ErrorBufSize: integer):BOOL;stdcall; external
подскажите по этому запросу, какой тип данных выбирать в IStream?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.09.2014, 00:30
Цитата Сообщение от Andreyip Посмотреть сообщение
почему именно такая структура
Цитата Сообщение от NickoTin Посмотреть сообщение
CharSet = CharSet.Ansi
Потому что Char занимает 8 бит - один байт.
Цитата Сообщение от NickoTin Посмотреть сообщение
string AddressName
Все строки что подаются только на вход и не будут изменяться внутри функции должны быть string, всё что меняется должно быть StringBuilder. LPStr здесь избыточны, да и применяются в основном COM Interop.
Цитата Сообщение от Andreyip Посмотреть сообщение
var RequestNum: DWord
var говорит о том что данные передаются по ссылке, т.е. ref в случае когда данные должны/могут быть инициализированы перед вызовом и значение может быть изменено функцией, out когда функция сама задает значение.
Цитата Сообщение от NickoTin Посмотреть сообщение
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool
Явное указание того что bool 4-х байтовый.

Цитата Сообщение от Andreyip Посмотреть сообщение
как прочитать данные в читабельном формате при ушибке из буфера
Посмотрите в сторону Encoding.GetEncoding и попробуйте различные варианты, если не получится с переводом текста из одной кодировки в другую, замените StringBuilder ErrorBuf на byte[] ErrorBuf, и работайте напрямую с байтами (пытайтесь их переводить из одной кодировки в другую).

Добавлено через 2 минуты
Цитата Сообщение от Andreyip Посмотреть сообщение
выбирать в IStream
Не работал, не подскажу. Судя по всему это вот этот IStream, как его приспособить сюда не знаю, ибо не работал. Проверять не на чем.
1
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
19.09.2014, 00:38  [ТС]
NickoTin,
В любом случае спасибо вам большое. Попробуем раскурить IStream.
0
0 / 0 / 0
Регистрация: 19.01.2015
Сообщений: 1
19.01.2015, 14:55
Связка с Rkeeper?
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 11
24.05.2018, 12:11
Andreyip, У меня точно такая же задача\ проблема))
В итоге как-то получилось справиться? Подскажите пожалуйста)
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
24.05.2018, 14:13  [ТС]
q13Ninja,
Реализовал класс IStream. и через него делаю обмен.
Сейчас можно обмениваться через http и не использовать rk7xml
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 11
24.05.2018, 14:32
А не поделитесь кодом?

Добавлено через 17 минут
А не поделитесь кодом?
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
24.05.2018, 15:36  [ТС]
q13Ninja,
Кодом класса IStream?
Поделюсь чуть позже. там все достаточно просто.
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 11
24.05.2018, 15:37
Да, буду очень рад посмотреть)
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 11
30.05.2018, 13:17
а нет ни у кого больше примера по IStream ?)

Добавлено через 1 час 45 минут
разобрался)
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
05.06.2018, 20:21  [ТС]
q13Ninja,

у меня это выглядит как то так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
  protected class XmlStream : IStream
        {
 
            private Stream _stream;
            internal XmlStream(Stream stream)
            {
                if (stream == null)
                {
                    throw new ArgumentNullException("ioStream");
                }
                this._stream = stream;
            }
            [SecurityCritical]
            void IStream.Read(byte[] buffer, int bufferSize, IntPtr bytesReadPtr)
            {
                int val = this._stream.Read(buffer, 0, bufferSize);
                if (bytesReadPtr != IntPtr.Zero)
                {
                    Marshal.WriteInt32(bytesReadPtr, val);
                }
            }
            [SecurityCritical]
            void IStream.Seek(long offset, int origin, IntPtr newPositionPtr)
            {
                SeekOrigin origin2;
                switch (origin)
                {
                    case 0:
                        origin2 = SeekOrigin.Begin;
                        break;
                    case 1:
                        origin2 = SeekOrigin.Current;
                        break;
                    case 2:
                        origin2 = SeekOrigin.End;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("origin");
                }
                long val = this._stream.Seek(offset, origin2);
                if (newPositionPtr != IntPtr.Zero)
                {
                    Marshal.WriteInt64(newPositionPtr, val);
                }
            }
            void IStream.SetSize(long libNewSize)
            {
                this._stream.SetLength(libNewSize);
            }
            void IStream.Stat(out System.Runtime.InteropServices.ComTypes.STATSTG streamStats, int grfStatFlag)
            {
                streamStats = default(System.Runtime.InteropServices.ComTypes.STATSTG);
                streamStats.type = 2;
                streamStats.cbSize = this._stream.Length;
                streamStats.grfMode = 0;
                if (this._stream.CanRead && this._stream.CanWrite)
                {
                    streamStats.grfMode |= 2;
                }
                else
                {
                    if (this._stream.CanRead)
                    {
                        streamStats.grfMode |= 0;
                    }
                    else
                    {
                        if (!this._stream.CanWrite)
                        {
                            throw new IOException("");
                        }
                        streamStats.grfMode |= 1;
                    }
                }
            }
            [SecurityCritical]
            void IStream.Write(byte[] buffer, int bufferSize, IntPtr bytesWrittenPtr)
            {
                this._stream.Write(buffer, 0, bufferSize);
                if (bytesWrittenPtr != IntPtr.Zero)
                {
                    Marshal.WriteInt32(bytesWrittenPtr, bufferSize);
                }
            }
            void IStream.Clone(out IStream streamCopy)
            {
                streamCopy = null;
                throw new NotSupportedException();
            }
            void IStream.CopyTo(IStream targetStream, long bufferSize, IntPtr buffer, IntPtr bytesWrittenPtr)
            {
                throw new NotSupportedException();
            }
            void IStream.Commit(int flags)
            {
            }
            void IStream.LockRegion(long offset, long byteCount, int lockType)
            {
                throw new NotSupportedException();
            }
            void IStream.Revert()
            {
                throw new NotSupportedException();
            }
            void IStream.UnlockRegion(long offset, long byteCount, int lockType)
            {
                throw new NotSupportedException();
            }
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.06.2018, 20:21
Помогаю со студенческими работами здесь

Импорт DLL библиотеки
как подключить к проекту DLL библиотеку и использивать функции в ней?

Импорт С++ библиотеки в .NET проект
админа ...переместите, пожалуйста, если не в тот раздел засунул Вопрос у меня в заголовке, но есть ещё и детали. Есть основной...

Импорт библиотеки .NET в IronPython
Появилась задача использовать библиотеку .NET найденную на просторах интернета, собственно вот она: ...

Импорт библиотеки с Гитхаба в Студию через compile
В проект необходимо добавить библиотеку. Она есть на Гитхабе: https://github.com/Androguide/HoloGraphLibrary Что нужно прописать в...

Неуправляемая DLL библиотека. Импорт, создание класса библиотеки
По курсовой нужно воспользоваться неуправляемой dll. Сразу скажу, возможно много где ошибаюсь в связи с узкими знаниями в этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru