Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Преобразование параметра ф-ии с C++ на C# 
:(
    Опции темы
Mag
Дата 19.7.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



На форуме много было тем про перевод программного кода с С++ в С#, прошелся по всем результатам поиска, моей проблемки не нашел.
Есть несколько функций, которые взяты с C++ и добавлены в код на С#:

Код

 ptChildNode.GetField(MF_NODE_SUBTYPE,&varSubType);
m_piMAMA.GetIconIndexBySubType(varSubType.llVal, &(iss.item.iImage));


&varSubType 
&(iss.item.iImage)

Как перевести эти параметры в C#?

А также:
Код

 TVINSERTSTRUCT iss 
 CComPtr<IMAMNode> ptNode
 HTREEITEM Root

При добавлении в С# Студия сообщает пишит такой эрор 
Цитата

Error    2    The type or namespace name 'CComPtr' could not be found (are you missing a using directive or an assembly reference?)

--------------------
В  каждой черной комнате есть выход - всегда есть выход с любой ситуации!
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 19.7.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



CComPtr не получится, ИМХО. Хотя может и можно как-то обернуть в p/invoke, не пробовал.

Адреса передаются через IntPtr.

Примеры взаимодействия неуправляемого кода (на С++ и т.п.) с управляемым можно посмотреть на www.pinvoke.net


--------------------
user posted image
PM MAIL WWW   Вверх
Mag
Дата 19.7.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



CComPtr, может хоть как-то можна применить его? Если получилось, снимается сразу большая проблема.
 
Если под С# использователь нельзя, может свой класс написать, аналог этому?

Это сообщение отредактировал(а) Mag - 19.7.2007, 17:25
--------------------
В  каждой черной комнате есть выход - всегда есть выход с любой ситуации!
PM MAIL WWW ICQ   Вверх
Mag
Дата 20.7.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Уточняю: CComPtr нужет был для работы с IUnknown. Вызывать AddRef и Release в моей программе. я так понимаю IUnknown в шарпе не применяется, если ошибаюсь, поправте меня. Значит этот интрефейс нужно реализовать в проекте. Подскажите как начинать писать?
--------------------
В  каждой черной комнате есть выход - всегда есть выход с любой ситуации!
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 21.7.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Можно попробовать следующее:
- объявить какую-нибудь функцию в С++ как dllexport
- в C# коде проимпортировать её из С++ DLL через [DllImport]
- вызывая эту функцию, передать из С++ в C# интерфейс как указатель в С++ и IntPtr в C#
- потом привести к object через Marshal.GetObjectForIUnknown

далее по обстоятельствам. К примеру, тот же Marshal поюзать для AddRef/Release.

Добавлено через 2 минуты и 30 секунд
P.S. вообще, если есть комовская DLL, почему бы просто не добавить её через Add reference...


--------------------
user posted image
PM MAIL WWW   Вверх
Mag
Дата 23.7.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  21.7.2007,  10:22 Найти цитируемый пост)
P.S. вообще, если есть комовская DLL, почему бы просто не добавить её через Add reference...


Есть длл, добавил. 
Код

 IMAMNode ptChildNode = null;//Здесь всё впорядке
 ptNode.GetChildByID(id, IntPtr ptChildNode);// тут с параметром ptChildNode проблемка, в С++ к ниму добавлялся &, в С# поставил IntPtr, но не работает.
 
Как с этим параметром быть?
Реализовать бы правильно этот параметр и будет работать.
--------------------
В  каждой черной комнате есть выход - всегда есть выход с любой ситуации!
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 23.7.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



IMAMNode - это что ? Класс, автосгенерированный при добавлении комовской длл в reference ? Если да, метод GetChildByID принадлежит классу и типы аргументов известны, зачем гадать что передавать во 2-м параметре ? IntelliSence показывает типы аргументов методов при наборе кода, смотрим туда. Если там object, передавайте ptChildNode. Если ref object, передавайте ref ptChildNode. Аналогично если out object.


--------------------
user posted image
PM MAIL WWW   Вверх
Mag
Дата 23.7.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 107
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Цитата(mr.DUDA @  23.7.2007,  12:09 Найти цитируемый пост)
IMAMNode - это что ? Класс, автосгенерированный при добавлении комовской длл в reference ? Если да, метод GetChildByID принадлежит классу и типы аргументов известны, зачем гадать что передавать во 2-м параметре ? IntelliSence показывает типы аргументов методов при наборе кода, смотрим туда. Если там object, передавайте ptChildNode. Если ref object, передавайте ref ptChildNode. Аналогично если out object.

Да сработало, IntelliSence показала второй параметр - ptChildNode, подставил.
Во время дебага возникают эрроры:
1. Error    3    The type or namespace name 'PreserveSig' could not be found (are you missing a using directive or an assembly reference?)
2. Error    5    The type or namespace name 'ComVisible' could not be found (are you missing a using directive or an assembly reference?)

Так как мне нужны методы Addref() and Release(), прописал в ручную интерфейс :
Код

[ComVisible(false)]
        [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
        Guid("00000000-0000-0000-C000-000000000046")]
        public interface IUnknown
        {
            IntPtr QueryInterface(ref Guid riid);

            [PreserveSig]
            UInt32 AddRef();

            [PreserveSig]
            UInt32 Release();
        }


Не может найти :       
 TVINSERTSTRUCT iss;
 public uint TreeBuild(IMAMNode ptNode, HTREEITEM Root, int Lvl)

Error    1    The type or namespace name 'TVINSERTSTRUCT' could not be found (are you missing a using directive or an assembly reference?)
Error    2    The type or namespace name 'HTREEITEM' could not be found (are you missing a using directive or an assembly reference?)    


--------------------
В  каждой черной комнате есть выход - всегда есть выход с любой ситуации!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.