![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Ky7m |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 8.4.2008 Репутация: 1 Всего: 2 |
Возникла проблема, описанная в этой теме [LINK], так как с места тема не сдвинулась, решаю своими рассуждениями и предположениями. Нужен опытный совет или решение.
Основная проблема, в том что в DLL есть структура, описание которой я знаю. Необходимо получить её адрес и заполнить значениями все поля. Поэтому возникает вопрос, что если получить адрес на начало структуры и потом скопировать уже проинициализированную данными структуру, созданную в программе, в эту область памяти? Какие способы получения адреса на точку входа? Я экспериментировал и следующий код
отрабатывает, значит я получаю адрес точки входа, а что дальше не совсем понятно. P.S. Извините, скорей всего это похоже на повторное создание темы, но мне кажется, что созданная исходная тема в "ветке Новичков" результатов не принесет, поэтому, если я прав, то просьба модератору перенести соответсвующую тему [LINK] в эту ветку. С уважением Игорь aka Ky7m |
|||
|
||||
| sCreator |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: 1 Всего: 5 |
Для начала надо правильно записать определение структуры на C#.
Далее, если ничего не найдете по передаче адреса структур ( я пока не встречал - встречал только импорт функций ), Напишите на С++ dll посредник - которая будет реэкспортировать функции и отдавать адреса структур с помощью функций типа extern ExternalInputs_PhGain* GetInputsGain(void); Это сообщение отредактировал(а) sCreator - 23.10.2010, 16:36 |
|||
|
||||
| Ky7m |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 8.4.2008 Репутация: 1 Всего: 2 |
Структуру записал, думаю проблем не будет с этим. Вот не хотелось еще одну библиотеку заводить. Просто не могу поверить, что C# не позволит мне получить адрес на структуру. Еще есть вариант небеопсного кода, но опять не хотелось, потому что теряется красота C#. С уважением Игорь aka Ky7m |
|||
|
||||
| sCreator |
|
||||||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: 1 Всего: 5 |
Я тоже не мог поверить но похоже это факт.
Сделал такой вариант библиотеку С++ с одной функцией которая может выдавать адреса символов из других библиотек ( типа чтото универсальное ) simbolloader.h :
simbolloader.cpp :
Тест на С# Program.cs :
SimbolLoader.cs :
Ну и тестовая dll testlib.h :
testlib.cpp :
В С++ я неочень - в основном читаю. |
||||||||||||
|
|||||||||||||
| Ky7m |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 89 Регистрация: 8.4.2008 Репутация: 1 Всего: 2 |
Спасибо за пример и благодарю за помощь, интересно копнуть в этом направлении. Я пока пошел рутинным путем и сделал обвертку (теперь еще плюс одна dll), и пока она работает оставлю так как есть, а для себя хочу разобраться с этой проблемой. Модифицировать приведенный пример для моей задачи.
Но хочется найти что-то проще и красивей, но смотрю, что с этим никто не встречался. |
|||
|
||||
| sCreator |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 20.8.2009 Где: Московская област ь Репутация: 1 Всего: 5 |
Модифицировать просто.
simbolloader.h (.cpp) - это все что я написал в С++ проекте Win32 - библиотека dll (может что надо дописать, а то пришлось применять CallingConvention = CallingConvention.Cdecl) SimbolLoader.cs - ее описание в C#. IntPtr - типа указателя неуправляемой памяти Маршалинг взаимодействия Маршалинг данных при вызове неуправляемого кода Marshal.PtrToStructureMarshal.PtrToStructure только копирует данные в управляемый код - есть обратный мотод. Перешел на активную работу в C# с полгода, но уже есть несколько моментов ограниченности. Т.е. вроде универсальный и только собирай из кирпичиков - но не все включено. Это сообщение отредактировал(а) sCreator - 24.10.2010, 17:15 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |