0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 6

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

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

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

У меня есть проект на С# (Windows Forms) к которому надо подключить библиотеку на С/С++ "WDMTMKv2.dll".
Вобщем на компьтере стоит плата с которой надо работать, а все библиотеки и примеры (консольные, под Dos) на С/С++. А мне надо как то работать с функциями описанными в .h файле (TmkOpen(), TmkClose()...). Файлы dll, cpp, h я загрузил в прилагающийся архив.
Подскажите, пожалуйста, как это сделать.
Вложения
Тип файла: rar INCLUDE.rar (113.4 Кб, 53 просмотров)
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
8729 / 3681 / 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
8729 / 3681 / 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
8729 / 3681 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru