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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов функции из dll написанной на С++ 
:(
    Опции темы
kiler4747
Дата 26.5.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как передать в функцию из dll(C++) параметры? Как передать int?

функция из dll
Код

extern "C" _declspec(dllexport) void cyctle( int i )
{
    for (int j = 0; j < i; j++)
    {
        int f;
        f = 30 * 10 / 13 + 54 -34 *12;
    }
}



Код

[DllImport("Exploer_03(dll).dll")]
        private extern static void cyctle(Int32 i);


cyctle(99999);
при вызове возникает ошибка

PM MAIL Skype   Вверх
jonie
Дата 26.5.2011, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



у вас cdecl метод вызова (по умолчанию в c++) - его и укажите в атрибуте:
Цитата

[DllImport("Exploer_03(dll).dll", CallingConvention = CallingConvention.Cdecl)]

 и название у вашей функции скорее всего будет _cyctle на экспорте - проверьте используя утилиту dumpbin или depends какой-нибудь 


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kiler4747
Дата 27.5.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как возратить указатель на int, wchar_t? Как возвращать строки? 
PM MAIL Skype   Вверх
kiler4747
Дата 27.5.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И как передавать указатели и строки в функции?
PM MAIL Skype   Вверх
jonie
Дата 27.5.2011, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



kiler4747, указатели как IntPtr C# тип, можно, конечно и как int (если у вас x86, см пояснение1).
строки (const wchar_t* const) как string C# тип, с указанием кодировки (посмотрите справку по DllImport).
строки wchar_t* const как StringBuilder с заранее выделенным размером
wchar_t как char (2 байта)

пояснение1: вообще говоря в с++ не определен размер базовых типов данных, определено лишь соотношение bool<=short<=....<=long<=double, но в x86 в windows sizeof(int)=4 = sizeof(void*) -- так что... С т.з. данных указатели в C# особо не котируются, разве что для нативных вещей...


Это сообщение отредактировал(а) jonie - 27.5.2011, 22:10


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kiler4747
  Дата 8.6.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как передавать многомерные массивы в функцию?
PM MAIL Skype   Вверх
jonie
Дата 9.6.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



kiler4747, как byte[] ? В C++ многомерные массивы хранятся в непрерывных блоках памяти, и, по большому счету всем пофиг сколько у них измерений -  блок-то один, так что можно его рассматривать как одномерный. Ну и передавать размеры не забывать.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kiler4747
  Дата 9.6.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что мне нужно исправить, чтобы программа работала? Размер массива я знаю.

Код

       [DllImport("Exploer_03(dll).dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
        extern static void eee(int [][] d);
        private void button5_Click(object sender, EventArgs e)
        {
            int[][] dd = new int[9][];
            for (int i = 0; i < 9; i++)
                dd[i] = new int[9];
            eee(dd);
        }


dll
Код

extern "C" _declspec(dllexport) void eee( int d[][9] )
{
    .......
}

PM MAIL Skype   Вверх
jonie
Дата 9.6.2011, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



kiler4747, вам копать в строну  [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = ***)]


Это сообщение отредактировал(а) jonie - 9.6.2011, 17:33


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
kiler4747
  Дата 10.6.2011, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не могли бы вы написать пример? У меня возник ещё вопрос: как из функции С++ вернуть массив в С# или как передать указатель на массив в функцию C++ и чтобы можно было изменять этот массив. smile 
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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