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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из C++ в C# 
:(
    Опции темы
qpeHukc
Дата 27.1.2006, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 18.12.2005
Где: Москва

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



есть код на C++, достающий функции из dll - ки. Суть функций - работа с платой АЦП. Нужно переписать этот код на C#

Код

#define IFC(type) virtual type __stdcall
#define FDF(type) type __stdcall

#ifndef __LUNKNOWN__
#define __LUNKNOWN__
struct LUnknown
{
   IFC(HRESULT)   QueryInterface(const IID& iid, void** ppv) = 0;
   IFC(ULONG)     AddRef() = 0;
   IFC(ULONG)     Release() = 0;
};
#endif

struct IDaqLDevice:LUnknown
{
   IFC(ULONG)  inbyte ( ULONG offset, PUCHAR data, ULONG len=1, ULONG key=0) = 0;
   IFC(ULONG)  inword ( ULONG offset, PUSHORT data, ULONG len=2, ULONG key=0) = 0;
   IFC(HANDLE) OpenLDevice() = 0;

... и так далее

};

DEFINE_GUID(IID_ILDEV, 0x32bb8320, 0xb41b,0x11cf, 0xa6, 0xbb, 0x00, 0x80, 0xc7, 0xb2, 0xd6, 0x82);


не могу найти соотв. конструкций и типов

Это сообщение отредактировал(а) qpeHukc - 27.1.2006, 02:14
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.1.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(qpeHukc @ 27.1.2006, 01:09 Найти цитируемый пост)
не могу найти соотв. конструкций и типов

их и не будет.

В дотнете работать с COM на порядок проще:
1) создаём например Console Application
2) заходим в "Add Reference..."
3) переходим на закладку COM, находим там нашу dll'ку (или если там нету, то идём в "Browse" и находим её там)
4) жмём OK - в проект добавляется набор классов-wrapper'ов для нашей dll, работаем с ними как с обычными классами

Если нужна помощь - скидывай в аттаче свою длл-ку в зипе, я напишу пример приложения.


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


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

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



Т.е. классы импорта создаются автоматически? Как тогда визард узнает, какие правила по вызовам использовались в dll?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 27.1.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Cr@$h @ 27.1.2006, 10:40 Найти цитируемый пост)
Т.е. классы импорта создаются автоматически? Как тогда визард узнает, какие правила по вызовам использовались в dll?

Да, автоматически. Как узнает - это дело визарда smile


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


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 18.12.2005
Где: Москва

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



Цитата(mr.DUDA @ 27.1.2006, 09:19)
Цитата(qpeHukc @  27.1.2006,  01:09 Найти цитируемый пост)
не могу найти соотв. конструкций и типов

их и не будет.

В дотнете работать с COM на порядок проще:
1) создаём например Console Application
2) заходим в "Add Reference..."
3) переходим на закладку COM, находим там нашу dll'ку (или если там нету, то идём в "Browse" и находим её там)
4) жмём OK - в проект добавляется набор классов-wrapper'ов для нашей dll, работаем с ними как с обычными классами

Если нужна помощь - скидывай в аттаче свою длл-ку в зипе, я напишу пример приложения.

к сожалению в dll - ке не COM.

Выводится сообщение : A reference to '...путь\lcomp.dll' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.
PM MAIL ICQ   Вверх
qpeHukc
Дата 27.1.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 18.12.2005
Где: Москва

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



Может это поможет лучше понять, что происходит в dll-ке. Вот как происходит работа с функциями длл-ки :

Код

int main()
{

ADC_PAR ap;
PLATA_DESCR pd;
SLOT_PAR sl;

   ULONG slot = 0;

   trace("Get IUnknown pointer");
   CallCreateInstance("lcomp.dll");            
   LUnknown* pIUnknown = CreateInstance(slot);
   if(pIUnknown == NULL) { trace("CallCreateInstance failed"); return 1; }
   
   trace("Get IDaqLDevice interface");
   IDaqLDevice* pI;
   HRESULT hr = pIUnknown->QueryInterface(IID_ILDEV,(void**)&pI);      //    [B]из dll-ки[/B]
   if(!SUCCEEDED(hr)) { trace("Get IDaqLDevice failed"); return 1; }
   trace("IDaqLDevice get success");
   trace("Free IUnknown");
   pIUnknown->Release();                //    [B]из dll-ки[/B]

   printf("\n handle %x",pI->OpenLDevice());         //    [B]из dll-ки[/B]



функция CallCreateInstance :

Код

ULONG CallCreateInstance(char* name)
{
   HINSTANCE hComponent = ::LoadLibrary(name);
   if(hComponent==NULL)
   {
//      cout << "Unable load dll" << endl;
      return 0;
   }

   CreateInstance = (CREATEFUNCPTR)::GetProcAddress(hComponent,"CreateInstance");
   if(CreateInstance==NULL)
   {
//      cout << "Unable find CreateInstance" << endl;
      return 0;
   }
   return 1;
}



Это сообщение отредактировал(а) qpeHukc - 27.1.2006, 21:18
PM MAIL ICQ   Вверх
Exception
Дата 27.1.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Библиотека совместима с OLE Automation? Если нет, на помощь врапперов не рассчитывай.
PM   Вверх
qpeHukc
Дата 28.1.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 18.12.2005
Где: Москва

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



Цитата(Exception @ 27.1.2006, 22:04)
Библиотека совместима с OLE Automation? Если нет, на помощь врапперов не рассчитывай.

есть пример работы с этой библиотекой на Delphi.

значит совместима, так ведь ?
PM MAIL ICQ   Вверх
Exception
Дата 28.1.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Не факт. Кинь dll, посмотрим.
PM   Вверх
qpeHukc
Дата 28.1.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 18.12.2005
Где: Москва

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



вот оно

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  lcomp.zip 34,90 Kb
PM MAIL ICQ   Вверх
mr.DUDA
Дата 28.1.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Враппер создать не получилось. Похоже на простейший COM-компонент. Всё что можно сделать, имхо, это скопировать все структуры и интерфейсы в код на C#, а все импортируемые ф-ции вынести с атрибутами [DllImport] в отдельный класс.


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


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 18.12.2005
Где: Москва

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



Цитата(mr.DUDA @ 28.1.2006, 08:37)
Враппер создать не получилось. Похоже на простейший COM-компонент. Всё что можно сделать, имхо, это скопировать все структуры и интерфейсы в код на C#, а все импортируемые ф-ции вынести с атрибутами [DllImport] в отдельный класс.

ясно

а как выносить типы ?

например ULONG в C# это ulong, а что делать с

void** ppv
const IID& iid
PUCHAR
HRESULT
PUSHORT Data ( может это равно ref ushort ?)
char *FileName
PM MAIL ICQ   Вверх
mr.DUDA
Дата 28.1.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



IID - это Guid
PUCHAR , char* - это byte*
HRESULT - HandleRef
PUSHORT - ushort*

С указателями в C# можно работать, если поставить у метода модификатор unsafe и выставить у проекта "Allow unsafe code". Вообще, строки при вызове функций из длл автоматически переводятся из char* в string и обратно.


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


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 18.12.2005
Где: Москва

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



не выходит с переделками типов.

было :

Код

IFC(HRESULT)   QueryInterface(const IID& iid, void** ppv) = 0; 


сделал :

Код

[DllImport("lcomp.dll",CallingConvention=CallingConvention.StdCall)] extern static
        public HandleRef QueryInterface(Guid iid, IntPtr i);


вызвал :

Код

Guid helperGuid = new Guid("32bb8320-b41b-11cf-a6bb-0080c7b2d682");
IntPtr intPtrVar = new IntPtr();

LUnknown.QueryInterface(helperGuid, intPtrVar);


пишет MarshalDirectiveException was unhandled

HandleRefs cannot be marshaled ByRef or from unmanaged to managed.

smile

в чем ссуть ?
PM MAIL ICQ   Вверх
mr.DUDA
Дата 31.1.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Пардон, я спутал - HandleRef нужен только для передачи и возврата виндошных дескрипторов aka хэндлов.
HRESULT хоть и начинается с H, но не хэндл smile
Обыкновенный Int32


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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