Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/35: Рейтинг темы: голосов - 35, средняя оценка - 4.57
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200

Простейший DLL на С и его loadlibrary in matlab

03.03.2013, 19:11. Показов 7509. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В VC 2010 создаю пустой консольный проект dll
Вот вот простейшие три функции targ1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <windows.h>
#include <iostream>
 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD  fdwReason, LPVOID Res)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 
extern "C"__declspec(dllexport) void LetterList()
{ 
    std::cout << "This function was called from LetterList() " << std::endl; 
} 
 
extern "C" __declspec(dllexport) int PutInt(int param) 
{ 
    return param; 
}
 
extern "C" __declspec(dllexport) int sum2num(int num1, int num2) 
{ 
    return num1 + num2; 
}
Вот targ1.h
C++
1
2
3
void LetterList();
int PutInt(int);
int sum2num(int, int);
Компиляция проходит, создаются файлы targ1.dll, targ1.lib.
В папку LIBS помещаю их и файл targ1.h
Открываю матлаб, перехожу в папку LIBS, загружаю библиотеку

loadlibrary('targ1','targ1'), смотрю функции libfunctionsview targ1


далее в матлабе:
Matlab M
1
2
a = int32(2); b = int32(3); 
calllib('targ1',sum2num(a,b))
Undefined function 'sum2num' for input arguments of type 'int32'.
Как бы я ни пытался изменить тип входных переменных а и b всегда подобное сообщение, что этот тип неопределен.
Что делать? пожалуйста помогите.

У меня вин7 64 бита mex - setup и т.д. проходит нормально
В VC тоже стоит режим х64 и в Project->Properties->VC++ Directories->Library Directories указан путь
C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64

Добавлено через 2 часа 7 минут
Ответ таков: с = calllib('targ1',sum2num,a,b)
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2013, 19:11
Ответы с готовыми решениями:

LoadLibrary не загружает dll
Здравствуйте. Вот такой код HINSTANCE hLib; int Error = GetLastError(); hLib =...

[Dll] Выполнение кода при LoadLibrary
Delete :)

Qt & MemoryModule - Загрузка DLL из памяти без LoadLibrary
Пишу программу и возникла резкая необходимость сохранить тело DLL библиотеки (тоже написанной мной) в памяти программы. т.е. библиотека...

1
45 / 6 / 1
Регистрация: 20.08.2012
Сообщений: 200
04.03.2013, 20:24  [ТС]
Еще пример работающего кода dll C и матлаба (с передачей из матлаба в dll матрицы и возвратом другой матрицы)
Создаем пустой консольный проект dll (у меня его имя cfuncs) и добавляем файлы
Файл lib.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct m_rgb_gr
{
    short rows;
    short cols;
    short M[480][752];
    short R[480][752];
    short G[480][752];
    short B[480][752];
    short Gr[480][752];
};
 
__declspec(dllexport) int sum2num(int, int);  
__declspec(dllexport) void matmat(struct m_rgb_gr*, struct m_rgb_gr*);
C++
1
2
3
4
5
6
#include "lib.h"
 
__declspec(dllexport) int sum2num(int num1, int num2) 
{ 
    return num1 + num2; 
}
Файл lib.c
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
__declspec(dllexport) void matmat(struct m_rgb_gr *s1, struct m_rgb_gr *s2)
{
    int i,j;
    for (i = 0; i < s1->rows; i++)
        for(j = 0; j < s1->cols; j++)
        {
            s1->M[i][j] = s2->M[i][j];
            s1->R[i][j] = s2->R[i][j];
            s1->G[i][j] = s2->G[i][j];
            s1->B[i][j] = s2->B[i][j];
            s1->Gr[i][j] = s2->Gr[i][j];
        }
}
Функция matmat просто копирует одну структуру в другую

В проекте VC стоит режим х64 и в Project->Properties->VC++ Directories->Library Directories указан путь
C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib\x64

В матлабе (предварительно нужно/можно скопировать lib.h в указанную папку (D:\Prog\dll\cfuncs\x64\Debug\), либо указать путь к файлу lib.h там где он был произведен
hfile = 'D:\Prog\dll\cfuncs\x64\Debug\lib.h';
dllfile = 'D:\Prog\dll\cfuncs\x64\Debug\cfuncs.dll ';
loadlibrary(dllfile, hfile) % загружаем dll

Где то в программе можем вызвать a = calllib('cfuncs','sum2num',1,2); просто для проверки, что dll работает

Чтобы вызвать вторую функцию matmat так: [S1 S2] = calllib('cfuncs','matmat',s1,s2);
Надо сначала создать структуры s1 и s2 в матлабе. Чтобы это сделать надо уже иметь матрицу размером 480х752 типа ... (тип даже не важен, у меня работает при любом типе)
Создаем матрицы
М - исходная матрица размером 480х752.
Далее моя функция получает из нее еще матрицы
[GRAY RGB R G B] = bayer2rgb(M);
(все это совсем не обязательно делать, можно просто написать например R = M + 10; или что то в этом роде)

O = 0*M;
s1.rows = 480; s1.cols = 752;
s1.M = O; s1.R = O; s1.G = O; s1.B = O; s1.Gr = O;
s2.M = M; s2.R = R; s2.G = G; s2.B = B; s2.Gr = GRAY;
теперь можно вызвать [S1 S2] = calllib('cfuncs', 'matmat', s1, s2);

Затем можно проверить действительно ли например S1.Gr == s2.Gr для всех пикселей.

Этот пример демонстрация как писать функции на С, сворачивать их в dll и затем вызывать его из матлаба.
Написал это специально для новичков в этом деле. Такая простота у меня отняла кусок жизни.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.03.2013, 20:24
Помогаю со студенческими работами здесь

как создать DLL в C++ простейший
Смотрел у буржуев туториал подключения DLL делал все по схеме выдало кучу ошибок. Кто то знает где рабочую схему по подключению простейшего...

Дизассемблирование DLL, правка кода и компиляция его в DLL
ни разу не писал на c#, не пользовался monodeveloperом. сделано следующее: 1. дизассемблировал библиотеку name.dll, использовал...

Интеграция matlab dll в C#
Добрый день. Написал простую функцию выбора максимального числа. Листинг .m файла function max = mymax(n1, n2, n3, n4, n5) %This...

Matlab dll и Delphi
Необходимо связать dll, созданную в MATLAB, и программу, написанную в Delphi. Для пробы создаю additor.m: function result =...

Подключение DLL - файлов к MatLab
Добрый день/вечер/ночь. Столкнулся я с такой проблемой: у меня имеется электронейромиограф(штука, которая снимает электрические...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru