1 / 1 / 0
Регистрация: 28.08.2012
Сообщений: 38
1
.NET 4.x

Использование Delphi DLL в C#

15.04.2014, 22:55. Показов 1395. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня была цель привязать программу по Harware ID.
Воспользовавшись этим: http://www.torins.ru/support/b... post_id=92 решил остановиться на Ionworx MachineID.

Однако если я делаю так как написано, программа просто закрывалась. Методами проб я обнаружил что она не хочет работать со строками (Функция возвращающая число - работает нормально)



Соответсвенно, первый MessageBox показывает значение нормально, а на 2ом крашится.

В чем может быть ошибка?

Демо библиотека: https://www.dropbox.com/sh/0ny... DcL0xKQjBq
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2014, 22:55
Ответы с готовыми решениями:

Конфликт имён, использование dll
Здрасте! Существует такая проблемма: Есть проект(Windows Form), с классом "SqlConnector"...

Использование DLL, написанной на C++, в C# (указатели)
Всем привет! Есть DLL, написанная на C++, в ней описана такая функция: int ReadData(int kpn,int...

Использование c# dll в C++ builder c COM и без
Столкнулся с проблемой, есть уже написаный и отлаженый код на C#, а dll нужно сделать для C...

Использование dll, созданной на prolog 5.2
Вопрос такой: как использовать dll (созданной на prolog 5.2) в c# win.form? на c# написан...

11
Эксперт Python
4630 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,131
Записей в блоге: 6
16.04.2014, 09:07 2
Там со строками есть сложности, с выделением памяти.
В каком виде возвращаете строку?

Могу посоветовать, в общем, оформить вашу библиотеку в виде COM, для таких дел. Будет проще, там COM памятью сам рулит.
0
1 / 1 / 0
Регистрация: 28.08.2012
Сообщений: 38
16.04.2014, 10:31  [ТС] 3
К сожалению библиотека не моя, и узнать как она устроена я не могу. В дропбоксе я скинул всю папку с ней, там есть пдф в котором она описана.

Если сможешь объяснить как заставить работать или привести пример работающего кода, будет супер
0
Эксперт Python
4630 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,131
Записей в блоге: 6
16.04.2014, 10:33 4
Извините, разбираться подробно времени нет.
В каком виде хотя бы возвращается строка, уж это должно быть известно.
Ну и как принимаете в C#, не помешает.
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
16.04.2014, 10:58 5
Вот такая сигнатура у функции
C++
1
char* __stdcall GetMachineID();
судя по скриншоту то импортируется правильно, по крайней мере я ошибки не заметил

Добавлено через 2 минуты
разве что здесь может быть ошибка
C++
1
void __stdcall SetHardware(BOOL, BOOL, BOOL);
ибо сишный BOOL это макрос над int'ом
1
Эксперт Python
4630 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,131
Записей в блоге: 6
16.04.2014, 11:03 6
Сейчас посмотрел на скриншот внимательно.
При импорте char* надо указывать тип маршаллинга
C#
1
[return: MarshalAs(UnmanagedType.LPWStr)]
Это для юникода (просто взял из примера), для неюникода посмотреть надо.
Но с выделением памяти тоже могут быть нюансы.
1
1 / 1 / 0
Регистрация: 28.08.2012
Сообщений: 38
16.04.2014, 11:07  [ТС] 7
Даже если я не использую SetHardware , все равно происходит краш. И происходит он из-за строк, так как функции возвращающие числа или bool работают нормально.

Добавлено через 1 минуту
Я пытался маршалировать для юникода, не полетело. Судя по докам оно возвращает ANSI строку в формате utf-8
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
16.04.2014, 11:08 8
DoctorBooooom, покажите, как вы импортируете. И покажите скрин ошибки. Выкладывайте все в сообщение, ссылки на сторонние ресурсы не приветствуются.
0
1 / 1 / 0
Регистрация: 28.08.2012
Сообщений: 38
16.04.2014, 11:12  [ТС] 9
Никакой ошибки не выскакивает. Просто завершается с кодом не 0( можно увидеть в конце скриншота)

По поводу сторонних ресурсов извиняюсь, куда сохранился скриншота Туда ссылку и дал.
0
Эксперт Python
4630 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,131
Записей в блоге: 6
16.04.2014, 11:12 10
UnmanagedType.LPStr попробуйте (без W)
0
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
16.04.2014, 12:10 11
Лучший ответ Сообщение было отмечено DoctorBooooom как решение

Решение

Скачал, попробовал, в общем пользуйтесь
C#
1
2
3
4
5
6
7
8
[DllImport("MachineID.dll", CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetMachineID();
 
public static string GetID()
{
    var lpstr = GetMachineID();
    return Marshal.PtrToStringAnsi(lpstr);
}
1
1 / 1 / 0
Регистрация: 28.08.2012
Сообщений: 38
16.04.2014, 12:38  [ТС] 12
Спасибо большое. Работает!

Добавлено через 2 минуты
А еще вопрос, можно ли эту библиотеку как нибудь грузить не из папки рядом, а из ресурсов например?
0
16.04.2014, 12:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2014, 12:38
Помогаю со студенческими работами здесь

Использование dll в других языках
Добрый вечер. Ситуация такая, у меня есть dll(библиотека классов) написанная на C#. Смогу ли я...

Тонкости использование нативных dll в C#
Добрый день. Сразу прошу прошения C# я занимаюсь всего 2 месяца. Имею нативную DLL на Си для...

Динамическая загрузка Dll из ресурсов и ее использование
Пытаюсь разобраться для себя , прошу помощи сделал как в статье https://habrahabr.ru/post/85480/ ...

Использование метода из dll (C++) с callback аргументами в C# программе?
Уже всю голову сломал, не могу разобраться с тем, как сопоставить типы данных параметров. Расскажу...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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