Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > C++ C# приложение


Автор: jimbo 18.10.2010, 14:45
Привет всем!

МСВС 08

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

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

спп класс будет получать уведомления-сообщения, когда есть что скачать с сервера. Как сообщить Сшарп классу, что данные есть?

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

Используй неуправляемый callback например.
Перед делегатом тег - UnmanagedFunctionPointer с нужным соглашением о вызове. Сам callback метод unsafe

Автор: jimbo 18.10.2010, 16:13
Код

 [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;
        }
}



Что не так сделал?Мне надо передать делегат в С++ класс.

Автор: Sartorius 18.10.2010, 16:26
А.. у тебя не native C++, a CLI. Из первого поста не понятно. Тогда можешь использоать обычные делегаты 
http://www.functionx.com/cppcli/classes/Lesson15c.htm

Автор: Sartorius 18.10.2010, 16:43
Вот тебе пример
Это в 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");
        }
    }
}


Автор: jimbo 18.10.2010, 16:53
Спасибо за ссылку, только там не то что надо по-моему. 

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

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

Код

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 секунды
Угу, то что надо! Спасибо большущее)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)