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

Подключением библиотеки С/С++ на С#

25.09.2012, 14:12. Показов 6963. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времени суток!

У меня есть проект на С# (Windows Forms) к которому надо подключить библиотеку на С/С++ "WDMTMKv2.dll".
Вобщем на компьтере стоит плата с которой надо работать, а все библиотеки и примеры (консольные, под Dos) на С/С++. А мне надо как то работать с функциями описанными в .h файле (TmkOpen(), TmkClose()...). Файлы dll, cpp, h я загрузил в прилагающийся архив.
Подскажите, пожалуйста, как это сделать.
Вложения
Тип файла: rar INCLUDE.rar (113.4 Кб, 49 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.09.2012, 14:12
Ответы с готовыми решениями:

Есть ли разница между подключением статической библиотеки и подключением одного только файла
Есть ли вообще разница между подключением статической библиотеки, например с файлом Unit1.h и подключением одного только файла Unit1.h ...

Беда с подключением библиотеки
Доброго времени суток. Суть проблемы в том, что один и тот же код работает по разному в зависимости от того находится ли он в библиотеки...

Проблема с подключением статической библиотеки (.a)
Всем привет, возникла проблема с подключением статической библиотеки. Файлы с библиотеки (для теста): libMy.c: #include...

7
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
25.09.2012, 19:42
Лучший ответ Сообщение было отмечено как решение

Решение

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
        const string WDMTMKv2 = @"F:\temp\INCLUDE\i386\DLL\WDMTMKv2.dll";
 
        [DllImport( WDMTMKv2 )]
        static extern uint TmkOpen ( );
 
        [DllImport( WDMTMKv2 )]
        static extern void TmkClose ( );
 
        [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Ansi )]
        struct TTmkConfigData
        {
            public short nType;
            [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 10 )]
            public string szName;
            public ushort wPorts1;
            public ushort wPorts2;
            public ushort wIrq1;
            public ushort wIrq2;
            public ushort wIODelay;
        }
 
        [StructLayout( LayoutKind.Sequential )]
        struct TTmkEventData
        {
            public int nInt;
            public ushort wMode;
            public ushort wValue0;
            public ushort wValue1;
            public ushort wValue2;
        }
 
        [DllImport( WDMTMKv2 )]
        static extern void tmkgetinfo (
            [Out] out TTmkConfigData pConfD
            );
 
        [DllImport( WDMTMKv2 )]
        static extern void tmkgetevd (
            [Out] out TTmkEventData pEvD
            );
Это часть переведенных прототипов, остальное сами.
з.ы. Читайте о маршалинге (Marshaling) и pinvoke.
3
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 6
01.10.2012, 15:33  [ТС]
Еще такой вопрос. К этой библиотеке еще приложен файл .cpp, в котором обозначены точки входа.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
HINSTANCE hDrvDll = NULL;
 
DWORD DrvOpen()
{
  if(!hDrvDll)
    hDrvDll = LoadLibrary("WDMTMKv2.dll");
 
 
  if(hDrvDll != NULL)
  {
    if(!(MT_Start = (hMT_Start) GetProcAddress(hDrvDll, "_MT_Start@8")))
      return 0;
    if(!(MT_GetMessage = (hMT_GetMessage) GetProcAddress(hDrvDll, "_MT_GetMessage@16")))
      return 0;
    if(!(MT_Stop = (hMT_Stop) GetProcAddress(hDrvDll, "_MT_Stop@0")))
...
Как правильно будет их перевести в С#:
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
            public static System.IntPtr hDrvDll = null;
 
    public static uint DrvOpen()
        {
      if (!hDrvDll)
        hDrvDll = new System.IntPtr();
 
 
      if (hDrvDll != null)
          {
        if (!(MT_Start() = DLLMethod))
          return 0;
        if (!(MT_GetMessage() = DLLMethod))
          return 0;
        if (!(MT_Stop() = DLLMethod))
          return 0;
                      }
 
    [DllImport("WDMTMKv2.dll", EntryPoint="_MT_Start@8")]
    internal static extern uint DLLMethod(uint dwBufSize, System.IntPtr hEvent);
    [DllImport("WDMTMKv2.dll", EntryPoint="_MT_GetMessage@16")]
    internal static extern uint DLLMethod(ref ushort Data, uint dwBufSize, int FillFlag, ref uint dwMsWritten);
    [DllImport("WDMTMKv2.dll", EntryPoint="_MT_Stop@0")]
    internal static extern uint DLLMethod();
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.10.2012, 16:20
Alek87, импорт в C# можно производить с помощью DllImport, если хотите также как и в C через GetProcAddress, тогда нужно использовать делегаты, вот только зачем если всё решается одним DllImport?
C#
1
2
3
4
5
6
7
8
        [DllImport( WDMTMKv2 )]
        static extern uint MT_GetMessage (
            [In, Out] ushort[] Data,
            [In] int dwBufSize,
            [MarshalAs( UnmanagedType.Bool )]
            [In] bool FillFlag,
            [Out] out int dwMsWritten
            );
1
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 6
01.11.2012, 14:16  [ТС]
Скажите пожалуйста как уйти(исправить) от ошибки "Невозможно упаковать "parameter #1": Недопустимое сочетание управляемого и неуправляемого типов." Возникае при использовании функции tmkgetevd
C#
1
2
3
4
5
6
7
8
[DllImport(WDMTMKv2)] 
public static extern void tmkgetevd(
            [Out] out TTmkEventData ppEvD
            );
 
TTmkEventData tmkEvd;
 
tmkgetevd(tmkEvd);
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.11.2012, 15:48
Цитата Сообщение от Alek87 Посмотреть сообщение
Невозможно упаковать "parameter #1": Недопустимое сочетание управляемого и неуправляемого типов
Вы что-то не так делаете, т.к. я так и не смог воспроизвести данную ошибку.
C#
1
2
3
TTmkEventData data;
 
tmkgetevd( out data );
Цитата Сообщение от Alek87 Посмотреть сообщение
tmkgetevd(tmkEvd);
Как минимум out не хватает, но в таком случае ошибка должна быть другой.


Покажите определение TTmkEventData, если Вы его меняли...

Добавлено через 7 минут
В моей структуре TTmkEventData нет никаких специфичных типов, которые могли бы вызвать такую ошибку...
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 6
01.11.2012, 16:34  [ТС]
Спасибо за ответ. Да ошибка оказалась в моем определении TTmkEventData.
0
26 / 25 / 3
Регистрация: 22.01.2013
Сообщений: 273
18.12.2013, 14:13
а еще лучше просто
C#
1
[DllImport("WDMTMKv2.dll", SetLastError = true)]
без
C#
1
const string WDMTMKv2 = @"F:\temp\INCLUDE\i386\DLL\WDMTMKv2.dll";
она тогда не нужна!
Если драйвер установлен до этого - библиотека найдется сама в системной директории...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.12.2013, 14:13
Помогаю со студенческими работами здесь

Проблемы с подключением библиотеки POI
Скачал POI poi-3.2-FINAL.jar. Подложил его в ext. На следующие строки выдается ошибка. import...

Компилировать с подключением библиотеки с матфункциями
Ошибки.Что нужно исправить?

Привести часть кода с динамическим подключением библиотеки
Подскажите, пожалуйста, как делается эта задача?

Проблема с подключением библиотеки для работы с SQLite
Доброго времени суток, решил вот немного «поизвращаться» и придумал себе следующую задачу: Дапустим у меня на сервере в какой-то папке...

В чём разница между обычным подключением сетевого диска и подключением сетевого диска при помощи политик?
Вопрос начинающего. В чём разница между обычным подключением сетевого диска и подключением сетевого диска при помощи политик))


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru