Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
123 / 121 / 6
Регистрация: 21.12.2011
Сообщений: 348

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

07.05.2012, 13:42. Показов 1217. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.05.2012, 13:42
Ответы с готовыми решениями:

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

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

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.05.2012, 13:42
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru