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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ C# приложение, C++ C# совместное приложение 
V
    Опции темы
jimbo
Дата 18.10.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

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



Привет всем!

МСВС 08

Пишу С++ Сишарп приложение. в шарпе будет класс, который используя библиотеку, будет записывать в БД значения. Для С++ либу скомпилить не смог. 
На С++ будет класс, который будет использоваться в Сшарпе. С++ класс будет создавать подключение к серверу, через длл, вытягивая данные с него. 

Т.е., надо подключиться к серверу и стягивать данные в режиме онлайн и пихать их в БД. 

спп класс будет получать уведомления-сообщения, когда есть что скачать с сервера. Как сообщить Сшарп классу, что данные есть?
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Sartorius
Дата 18.10.2010, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



Цитата(jimbo @  18.10.2010,  15:45 Найти цитируемый пост)
Как сообщить Сшарп классу, что данные есть? 

Используй неуправляемый callback например.
Перед делегатом тег - UnmanagedFunctionPointer с нужным соглашением о вызове. Сам callback метод unsafe
PM MAIL ICQ   Вверх
jimbo
Дата 18.10.2010, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

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



Код

 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
  unsafe public delegate void DataArrived(void *data,int total);
  unsafe public void Data(void* data, int total)
        {
             if(data!=null && total!=0)
             {
                 char* name= (char*)data;
                 Console.WriteLine(name->ToString());
             }
        }

unsafe static void Main(string[] args)
        {
            Class1 cpplib= new Class1();
            cpplib.CreateDelegate(Data);       //error CS0570: 'CreateDelegate' is not supported by the language

}


C++

typedef void (__cdecl *ExportHandle)(void *,int ); 

public ref class Class1
{
public:        
        
        ExportHandle sharpNotify;
        void CreateDelegate(ExportHandle eh)
        {
            sharpNotify = eh;
        }
}



Что не так сделал?Мне надо передать делегат в С++ класс.
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
Sartorius
Дата 18.10.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



А.. у тебя не native C++, a CLI. Из первого поста не понятно. Тогда можешь использоать обычные делегаты 
вот о делегатах в managed С++
PM MAIL ICQ   Вверх
Sartorius
Дата 18.10.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



Вот тебе пример
Это в dll-ке на С++
Код

// Caller.h

#pragma once

using namespace System;

namespace Caller {

    public delegate void MyDelegate(int i);
    public ref class Class1
    {
        event MyDelegate ^ MyEvent;
    public: 
        void SetEvent(MyDelegate ^ hndlr)
        {
            MyEvent += hndlr;
        }
        void CallEvent()
        {
            MyEvent(0);
        }
        
    };
}


Это часть на C#
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Caller;

namespace Delegates
{
    class Program
    {
        static void Main(string[] args)
        {
            Class1 c1 = new Class1();

            c1.SetEvent(Handler);
            c1.CallEvent();
        }

        public static void Handler(int i)
        {
            Console.WriteLine("Was called");
        }
    }
}


PM MAIL ICQ   Вверх
jimbo
Дата 18.10.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 18.6.2009
Где: Южно-Сахалинск

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



Спасибо за ссылку, только там не то что надо по-моему. 

У меня есть класс Сшарп и класс С++. В С++ я получаю данные, мне надо это данные отдавать классу Сшарп. Когда приходят данные, надо уведомлять об этом класс Сшарп.

т.е. В шарпе мы создаем экземпляр класса С++. вызываем функции получения данных. допустим 

Код

cpplib.ConnectAndReceive();


Потом когда данные пришли, надо как-то отдать их Сшарп классу. Создаю делегат, функцию приема в классе Сшарпа.

Код

 unsafe public delegate void DataArrived(void *data,int total);
  unsafe public void Data(void* data, int total)
        {
             if(data!=null && total!=0)
             {
                 char* name= (char*)data;
                 Console.WriteLine(name->ToString());
             }
        }


Как передать указатель на функцию Data в класс С++ чтобы из класса С++ вызывать функцию Data?

Добавлено через 6 минут и 54 секунды
Угу, то что надо! Спасибо большущее)
--------------------
Я не играю в шахматы - в шахматах я борюсь. А.А.Алехин
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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