С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 8

Работа с библиотекой в проекте C#

13.01.2016, 15:30. Показов 2547. Ответов 15
Метки dll (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

В проекте C# я подключил библиотеку, написанную, как я понял, на C++, но возникли проблемы с использованием ее функций.

Ее суть в том, что она создает канал управления, а затем обращаясь к нему, общается с другой программой.

У этой библиотеки есть заголовочные файлы (*.pas и *.h) для проектов на языках Delphi и C++ соответственно.

Вырезка из *.h:
C++
1
2
3
4
5
6
7
8
9
//создание канала управления
void * __import CreateObject(void);
 
// Передача файла
bool __import SendFile(void *h, char *file_name);
 
// Закрытие канала управления
void __import DestroyObject(void *h,   // хэндл объекта управления
                            bool close_app); // флаг закрытия
Вырезка из *.pas:
Delphi
1
2
3
4
5
6
7
8
9
10
        // Создание объекта управления 
        // ~возвращает хэндл объекта управления h
        function CreateObject() : THandle; cdecl; external 'ctl.dll';
 
        // Передача файла
        function SendFile(h : THandle; file_name:PChar) : Boolean; cdecl; external 'ctl.dll';
 
        // Уничтожение объекта управления
        procedure DestroyObject(h : THandle;
                                close_app : Boolean); cdecl; external 'ctl.dll';
Суть вопроса в следующем: как мне создать канал управления, а затем передавать его в другие функции библиотеки, в моем проекте на C#?

P.S. Прошу прощения, если вопрос не в соответствующей теме, пишу первый раз, другой подходящей темы не нашел.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.01.2016, 15:30
Ответы с готовыми решениями:

Работа с библиотекой
В чем ошибка? 1.unit2.pas(57,58) Error: Fields cannot appear after a method or property definition, start a new visibility section first ...

Работа с библиотекой
Есть динамическая библиотека, как вызвать фукцию которая храниться в библиотеки????

Работа с GD библиотекой
Как можно реализовать передачу изображения созданного с помощью GD библиотеки в twitter ?

15
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
13.01.2016, 15:48
Подключайте через DllImport пример:
C#
1
2
[DllImport("Lib.dll")]
void CreateObject();
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 8
13.01.2016, 15:56  [ТС]
Если написать следующее:
Кликните здесь для просмотра всего текста

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
namespace DEL_Test_2_dll
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                NativeMethods.RMCCreateObject();
            }
            catch (Exception ef)
            { }
        }
    }
 
    public partial class NativeMethods
    {
        [DllImport("CTL.dll", CharSet = CharSet.Auto)]
        public static extern void CreateObject();
    }
}


То функция в библиотеке выполняется и загружает окно сторонней программы.

Но как мне передать объект этой функции в другую:
SendFile(?, ?);
Какие параметры отправлять?
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
13.01.2016, 16:20
примерно так:
объявление функций:
C#
1
2
3
4
[DllImport("CTL.dll", CharSet = CharSet.Auto)]
public static extern void CreateObject(out IntPtr handle);
[DllImport("CTL.dll")]
bool SendFile(IntPtr handle, string file_name);
использование:
C#
1
2
3
4
5
6
7
8
9
10
11
12
IntPtr handle = IntPtr.Zero;
string file = "test.txt";
CreateObject(out handle); // после создания окна в эту переменную поместиться его хэндл
bool result = SendFile(handle,file); // отправляем функции хэндл окна и имя файла
if(result)
{
  //что-то делаем если отправили файл
}
else 
{
  //что-то делаем если ошибка
}
для понимания какие типы c++ в какие преобразуются для c# в dllimport можешь почитать эту статью
1
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 8
13.01.2016, 16:41  [ТС]
Выдает ошибку на 3 строке:

Кликните здесь для просмотра всего текста

Помощник отладки управляемого кода "PInvokeStackImbalance" обнаружил неполадку в ...

Дополнительные сведения: Вызов функции PInvoke "DEL_Test_2_dll!DEL_Test_2_dll.NativeMet hods::CreateObject" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.


Так же я прочитал, что PChar в Delphi это указатель на первый символ в строке.
Получается что в SendFile вторым аргументом нужно передавать не строку...
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
13.01.2016, 16:50
Задайте правильные CharSet и CallingConvention
[DllImport("CTL.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Cdec l)]

Цитата Сообщение от val-rusik Посмотреть сообщение
олучается что в SendFile вторым аргументом нужно передавать не строку...
Гугл знает.
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
13.01.2016, 16:58
Лучший ответ Сообщение было отмечено val-rusik как решение

Решение

упс, походу мой косяк
C#
1
2
3
4
5
6
[DllImport("CTL.dll", CharSet = CharSet.Auto)]
public static extern IntPtr CreateObject();
 
/*******************/
IntPtr handle = CreateObject();
bool result = SendFile(handle,file); // отправляем функции хэндл окна и имя файла
ну вроде так должно быть

Добавлено через 7 минут
по поводу второго параметра в SendFile, надо сопоставлять данные точно, пока нету на это времени, но если это символ тогда интересно как это реализовано в функции по символу понимать что за файл
1
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
13.01.2016, 17:02
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
как это реализовано в функции по символу понимать что за файл
Не по символу. Компилятор знает, как преобразовать cишный *char в сишарповский string.

Добавлено через 54 секунды
В большинстве случаев очевидно, какой тип использовать. В сложных случаях приходится гуглить доки.
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
13.01.2016, 17:06
Shamil1, я про это:
Так же я прочитал, что PChar в Delphi это указатель на первый символ в строке.
я то написал сразу string ибо интуитивно понятно, что там должен быть он.
1
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 8
13.01.2016, 17:27  [ТС]
SeIZVeIZ, похоже работает, но ошибка теперь вылетает на:
bool result = SendFile(handle, file);
Полагаю потому что отправляю строку.

Shamil1, если добавить этот флаг, то ошибки вообще не вылетают. программа загружается, но строка с файлом, разумеется, не отправляется.
Задайте правильные CharSet и CallingConvention
[DllImport("CTL.dll", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Cdec l)]
По таблице которую SeIZVeIZ отправил, как я понял, char* (C++) соответствует LPSTR (C#), но как пользоваться этим не понятно, примеров в нете пока не нашел, как и подробного описания.
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
13.01.2016, 17:43
val-rusik, ты не там смотришь по таблице:
char* - > System.String
Добавлено через 5 минут
вместо string можно ещё попробовать StringBuilder он тоже заменяет char*

Добавлено через 7 минут
P.S. Да и текст ошибки было бы неплохо видеть, на что всё-таки ругается там
1
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 8
13.01.2016, 17:51  [ТС]
Ошибка:
Кликните здесь для просмотра всего текста

Помощник отладки управляемого кода "PInvokeStackImbalance" обнаружил неполадку в ...

Дополнительные сведения: Вызов функции PInvoke "DEL_Test_2_dll!DEL_Test_2_dll.NativeMet hods::SendFile" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
13.01.2016, 18:06
У меня остаётся только такое предположение, однако точно не уверен:
C#
1
2
3
4
5
6
7
[DllImport("CTL.dll")]
bool SendFile(IntPtr handle, StringBuilder file_name);
 
/*************/
StringBuilder sb = new StringBuilder();
sb.Append("test1.txt");
bool result = SendFile(handle,sb); // отправляем функции хэндл окна и имя файла
Добавлено через 7 минут
p.s. если это не поможет, было бы здорово на тестовом проекте это пощупать и понять точно.
1
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 8
13.01.2016, 18:31  [ТС]
Промежуточный итог:
Через:
IntPtr handle = CreateObject();
программа загружается, а через:
DestroyObject(handle, true);
она уничтожается.

StringBuilder для SendFile не работает...

P.S. тестовый проект не получится создать, т.к. библиотека работает со сторонней программой инсталяков которой меня нет.
0
Модератор
Эксперт функциональных языков программирования
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,876
13.01.2016, 19:02
Почитайте про атрибут DllImport и попробуйте разные варианты для CallingConvention, CharSet и т.д.
У параметров функции тоже могут быть атрибуты. Например, MarshalAs.
C#
1
2
3
4
5
6
[DllImport("CTL.dll",
CallingConvention = CallingConvention.StdCall, //CallingConvention.Cdecl
CharSet = CharSet.Ansi // CharSet.Auto
)]
bool SendFile(IntPtr handle, 
[MarshalAs(UnmanagedType.LPStr)] string file_name);
1
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 8
13.01.2016, 20:02  [ТС]
Все, проблема решена, работает следующий код:
Кликните здесь для просмотра всего текста

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
namespace DEL_Test_2_dll
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        IntPtr handle; //Определяемый платформой тип, который используется для представления указателя или дескриптора.
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                handle = NativeMethods.CreateObject();
                IntPtr sptr = Marshal.StringToHGlobalAnsi("C:\\123.dat");
                if (NativeMethods.SendFile(handle, sptr))
                    button1.Text = "Ok";
                else
                    button1.Text = "Error";
            }
            catch (Exception ef)
            { }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            NativeMethods.DestroyObject(handle, true);
        }
    }
 
    public partial class NativeMethods
    {
        [DllImport("CTL.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        unsafe public static extern IntPtr CreateObject();
        [DllImport("CTL.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        unsafe public static extern bool SendFile(IntPtr tr, IntPtr file_name);
        [DllImport("CTL.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
        unsafe public static extern void DestroyObject(IntPtr tr,bool b);
    }
}


P.S. Большое всем Спасибо за помощь (+1);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.01.2016, 20:02
Помогаю со студенческими работами здесь

Работа с библиотекой
Нужно создать 3 функции в библиотеке по имени, по индексу, по совпадающему имени. New--Other--Dll Wizard. Я создал для проверки хотя бы...

Работа с библиотекой
Ребят помогите пожалуйста, 1 курс всего. Я создал библиотеку, работаю в ней, но для того кто бы открыть пункт меню приходиться каждый раз...

Работа с библиотекой PKCS 11
Кто нибудь работал с библиотекой PKCS 11 ? тык.. Пытаюсь получить ID сертификата с токена JaCarta. И вроде бы инициализирую...

Работа с библиотекой glut
Здравствуйте. Не получается скомпилировать код из-за ошибки: 'glutSolidCone' was not declared in this scope. Но все что нужно я вроде...

Работа с библиотекой книг
Проблема в том,что когда я поменял ID книжки и после решил ее удалить по новому ID выдало ошибку. Реализовать функции: 1) вывода...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru