Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
7 / 7 / 1
Регистрация: 09.07.2009
Сообщений: 558
1

Вызов функций из DLL на С++

29.06.2015, 17:31. Показов 2960. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В программе:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
 
namespace CsCons
{
  public class clDll
  {
    [DllImport("d:\\MyProgramming\\CsCpp\\Debug\\CsCppDll.dll", EntryPoint="Add", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int Add(int a1);
 
    [DllImport("d:\\MyProgramming\\CsCpp\\Debug\\CsCppDll.dll", EntryPoint = "Sub", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern int Sub(int s1);
 
   }
 
 
  class Program
  {
    static void Main(string[] args)
    {
      int res = clDll.Add(25);
      Console.WriteLine("Результат = {0}", res);
      res = clDll.Sub(15);
      Console.WriteLine("Результат = {0}", res);
      Console.ReadKey();
    }
  }
}
функции из DLL работают, но возникли следующие вопросы:
- перед каждой функцией нужно записывать в квадратных скобках DLLImport и EntryPoint или есть другой путь?
- сколько раз загружается DLL? Только при первом вызове или при каждом DLLImport?
- можно ли один раз записать DllImport и иметь возможность вызова всех функций из DLL?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2015, 17:31
Ответы с готовыми решениями:

Вызов из Python функций сторонней DLL
Подскажите пожалуйста по такому вопросу. Нужно из Python вызвать функцию из сторонней DLL. Проблема...

Экспорт функций из dll на c++ и вызов из Delphi
Вызываю экспортируемую функцию из dll которая написана на c++. Вызываю из Delphi, с вызовом проблем...

Вызов функций из DLL, написанной на CBuilder.
Всем привет! Есть немаленький софт, написанный на CBuilder. Нужно подгрузить в программе на...

Подключение сторонней .dll и вызов экспортируемых функций
Здравствуйте! Вопрос - сабж. Поясняю: Есть у меня стороння .dll (вроде как написана на c++)....

4
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.06.2015, 00:22 2
Лучший ответ Сообщение было отмечено tumanovalex как решение

Решение

Цитата Сообщение от tumanovalex Посмотреть сообщение
перед каждой функцией нужно записывать в квадратных скобках DLLImport и EntryPoint или есть другой путь?
DllImport - да, путь можно относительный использовать (т.е. просто имя файла например), EntryPoint - не обязательно, только если имя функции отличается от того что используется в прототипе.
Цитата Сообщение от tumanovalex Посмотреть сообщение
сколько раз загружается DLL? Только при первом вызове или при каждом DLLImport?
Только при первом. Стандартный механизм загрузки библиотек таков, что если библиотека уже загружена, то просто увеличивается счетчик числа загрузок и возвращается адрес уже загруженной библиотеки.
Цитата Сообщение от tumanovalex Посмотреть сообщение
можно ли один раз записать DllImport и иметь возможность вызова всех функций из DLL?
Нет.

В вашем случае импорт можно упростить до такого:
C#
1
2
    [DllImport("CsCppDll.dll")]
    public static extern int Add(int a1);
при условии что библиотека будет находиться рядом с исполняемым файлом.
0
7 / 7 / 1
Регистрация: 09.07.2009
Сообщений: 558
30.06.2015, 16:26  [ТС] 3
Спасибо большое за подробные объяснения. Возник еще один вопрос:
Можно ли обратиться в C# к переменной, определенной в DLL? В моем случае это Ncount. Я попробовал обратиться к ней аналогично функции, не получилось.
0
Почетный модератор
Эксперт .NET
8721 / 3673 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.06.2015, 16:45 4
Цитата Сообщение от tumanovalex Посмотреть сообщение
Можно ли обратиться в C# к переменной, определенной в DLL?
Нет. Возможен только вызов экспортируемых функций.

Добавлено через 9 минут
Хотя нет, возможно, но смысла не вижу.
Пример для теста:
C
1
2
3
4
5
6
__declspec(dllexport) int value;
 
__declspec(dllexport) int __stdcall GetValue(void)
{
    return value;
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern IntPtr LoadLibrary(string dllToLoad);
 
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool FreeLibrary(IntPtr hModule);
 
        [DllImport("Win32Project1.dll")]
        private static extern int GetValue();
 
        static void Main(string[] args)
        {
            IntPtr mydll = LoadLibrary("Win32Project1.dll");
 
            IntPtr addrUnmanagedHeap = GetProcAddress(mydll, "value");
            
            Marshal.WriteInt32(addrUnmanagedHeap, 10);
            var k = GetValue();
        }
0
7 / 7 / 1
Регистрация: 09.07.2009
Сообщений: 558
30.06.2015, 16:47  [ТС] 5
Спасибо за ответы.
0
30.06.2015, 16:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2015, 16:47
Помогаю со студенческими работами здесь

Php использование сторонних dll и вызов функций
добрый день насколько я понимаю подключить староннюю dll (скомпилированная с .NET Framework 4)...

Подключение DLL (написаных на С). Вызов функций с указателями в параметрах
Здравствуйте, есть библиотека написанная на С (с большой вероятностью). Есть функция описанная в...

Вызов, получение списка функций процесса из injection dll
Есть ли способ получить каким либо образом список функций, или для этого надо дизассемблировать...

Вызов DLL-функций в своем языке программирования. Обсуждение
По совету Usaga закрываю эту тему в разделе "C++ для начинающих" и признаю, что пошел по ложному...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru