123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348
1

Вызов делегата из DLL библиотеки написанной на C

07.05.2012, 13:42. Показов 953. Ответов 0
Метки нет (Все метки)

Проблема состоит в том, что вызывая делегат с параметрами, приложение завершается (точнее отрабатывает 1 раз, а потом завершается).
Если вызывать делегат без параметров, то все работает. Подскажите что я делаю не так.
Код DLL
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// dll.h
#include <stdio.h>
#include <Windows.h>
 
typedef void (*CallBack)(DWORD);
extern "C" __declspec(dllexport) void Foo(CallBack funkPtr);
 
// dll.cpp
#include "dll.h"
 
extern "C" __declspec(dllexport) void Foo(CallBack funkPtr) {
  while( true ) {
    funkPtr(1);
    Sleep(1000);
  }
}
Код приложения
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Runtime.InteropServices;
 
namespace TestProject {
  public class Program {
    public delegate void FooDelegate(uint m);
 
    [DllImport("my.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void Foo(FooDelegate f);
 
    public static void Main( string[] args ) {
      var f = new FooDelegate(Hello);
      Foo(f);
      Console.ReadLine();
    }
 
    public static void Hello(uint m) {
      Console.WriteLine( m.ToString() );
    }
  }
}
Добавлено через 1 час 17 минут
пасаны все получилось!
надо было просто к функции приписать __cdecl
вот так
C
1
extern "C" __declspec(dllexport) void __cdecl Foo(CallBack funkPtr);
что-то я протупил.

Добавлено через 1 час 16 минут
Даже не так. Вообщем оставлю это здесь как решение проблемы вызова делегата с параметрами из
unmanaged DLL библиотеки.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// dll.h
#include <strio.h>
#include <Windows.h>
 
typedef void (__stdcall *CallBackFunc) ( DWORD );
 
extern "C" __declspec(dllexport) void Foo( CallBackFunc funkPtr );
 
// dll.cpp
#include "dll.h"
 
extern "C" __declspec(dllexport) void Foo( CallBackFunc funkPtr ) {
  while( true ) {
    funkPtr( 1 );
    Sleep( 1000 );
  }
}
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Runtime.InteropServices;
 
namespace TestProject {
  public class Program {
    public delegate void FooDelegate( uint m );
 
    [DllImport( "my.dll" )]
    public static extern void Foo( FooDelegate f );
 
    public static void Main() {
      var f = new FooDelegate( ShowMessage );
 
      Foo( f );
    }
 
    public static void ShowMessage( uint m ) {
      Console.WriteLine( m );
    }
  }
}
По сути, все что нужно было, это добавить __stdcall к *CallBackFunc.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2012, 13:42
Ответы с готовыми решениями:

Вызов программой, написанной на С++, функции из dll, написанной на Assembler (явное подключение dll)
Доброго времени суток!Задали лабораторную работу: программа, написанная на с++ должна подключать...

вызов dll написанной на с++
Всем доброго дня!!! Ребята помогите пожалуйста не могу получить результат в Delphi из вызываемой...

Вызов функции из dll написанной на C
Привет всем! Возникла такая задача, решить не могу ни как. Есть dll. В ней есть функция (вроде...

Чтение dll библиотеки написанной на C++ Builder 5 в C#
VS 2010. Казалось бы простой процесс чтения dll созданной в C++ Builder 5 выдаёт в C#...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2012, 13:42
Помогаю со студенческими работами здесь

Вызов функции из DLL, написанной на Delphi
Здрасте, У меня тут такая ситуация: Рыскал как то я, по просторам интернета, решение 1 проблемы,...

Вызов функций из DLL, написанной на CBuilder.
Всем привет! Есть немаленький софт, написанный на CBuilder. Нужно подгрузить в программе на...

Реализовать вызов dll, написанной на Delphi, в C++
Приветствую! Только недавно наал изучать dll и не очень понимаю почему вылезает ошибка в коде. Что...

Использование библиотеки dll написанной в Visual Basic
Здравствуйте. Не получается использовать библиотеку написанную в VB. Вот так вызываю функцию...

Чтение dll библиотеки написанной на C++ Builder 5 в Lazarus
Чтение dll библиотеки написанной на C++ Builder 5 в проекте Lazarus версии 2.0.4 с FPC 3.0.4...

Подключение библиотеки DLL написанной на Си к проекту VB.NET
Мне нужен подробный пример написания библиотеки на Си и ее подключения к проекту VB.NET. Ссылку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru