Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
ED
10 / 10 / 3
Регистрация: 06.04.2009
Сообщений: 93

Импорт DLL библиотеки

06.01.2011, 14:55. Показов 6345. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как подключить к проекту DLL библиотеку и использивать функции в ней?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2011, 14:55
Ответы с готовыми решениями:

Импорт dll
Всем здрасте) Суть вопроса такова: Мне надо импортировать в создаваемую dll динамические библиотеки из другой программы, чтобы можно...

CDialogEx + dll, После завершения модального диалога (CDialogEx) из длл-библиотеки работа длл-библиотеки прерывается
Добрый день, подскажите, пожалуйста, новичку с++/mfc. Работаю в VS 2010. Есть необходимость разработки длл-библиотеки, которая в своём...

Импорт DLL из Delphi в Visual C++
Всем доброго времени суток! У меня появилась необходимость импортировать в проект библиотеку собранную в делфи. Есть DLL файл и больше...

8
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
06.01.2011, 15:18
1) вариант если нет *.lib то динамическая линковка..
На подобии этого
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <string>
 
#include <Windows.h>
 
typedef unsigned (__stdcall *xstrlenPtr)      (const char*);
typedef int  (__cdecl   *xstrcmpPtr)      (const char*, const char*);
typedef unsigned (__fastcall    *lab_functionPtr) (const char*, const char*, int*);
 
 
template <typename T>
T _GetProcAddress(HINSTANCE h, const char *fun_name){
    T res = reinterpret_cast<T>(GetProcAddress(h, fun_name));
    if(!res) 
        throw std::runtime_error(std::string("error load function: [ ") + fun_name + " ]");
    return res;
}
 
int main(){
 
    HINSTANCE hDll = LoadLibrary(TEXT("lab_dll.dll"));
 
    xstrlenPtr xstrlen;
    xstrcmpPtr xstrcmp;
    lab_functionPtr lab_function;
 
    try {
 
        if(!hDll) throw std::runtime_error( "error -> LoadLibrary(TEXT(\"lab_dll.dll\"))");
 
        xstrlen = _GetProcAddress<xstrlenPtr>(hDll, "xstrlen");
        xstrcmp = _GetProcAddress<xstrcmpPtr>(hDll, "xstrcmp");
        lab_function = _GetProcAddress<lab_functionPtr>(hDll, "@lab_function@12");
 
        const char *str1 = "Line 2DDD";
        const char *str2 = "Gine 1GGG";
        int buff[65] = {0};
 
        std::cout << xstrlen(str1)  << std::endl;
        std::cout << xstrcmp(str1, str2)    << std::endl;
 
        int n = lab_function(str1, str2, buff);
        for(int i = 0; i < n; ++i)
            std::cout << buff[i] << ' ';
        std::cout << std::endl;
 
    } catch (const std::exception &e) {
        std::cout << e.what() << std::endl;
    }
 
    return 0;
}
Для статической линковки проще..
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
#include <iostream>
#pragma comment(lib, "lab_dll.lib") 
 
 
extern "C"{
    unsigned    __stdcall   xstrlen(const char*);
    int     __cdecl     xstrcmp(const char*, const char*);
    unsigned    __fastcall  lab_function(const char*, const char*, int*);
};
 
int main(){
    const char *str1 = "Line 2DDD";
    const char *str2 = "Gine 1GGG";
    int buff[65] = {0};
 
    std::cout << xstrlen(str1)  << std::endl;
    std::cout << xstrcmp(str1, str2)    << std::endl;
 
    int n = lab_function(str1, str2, buff);
    for(int i = 0; i < n; ++i)
        std::cout << buff[i] << ' ';
    std::cout << std::endl;
    return 0;
}
Код dll ( как - то на асме присал и взял за пример..)
Assembler
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
.686
.model flat, stdcall
option casemap:none
 
include windows.inc
 
.code
 
DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD
    mov eax, TRUE
    ret
DllEntry endp
 
    _strlen_ PROC  uses edi ecx
        
        mov ecx, -1
        xor eax, eax
        repnz scasb
        neg ecx
        lea eax, [ecx - 2]
        
        ret
 
    _strlen_ endp
    
    astrlen PROC  STDCALL uses edi, lpstr :DWORD
        
        mov edi, lpstr
        
        call _strlen_
        
        ret
    astrlen endp
    
    astrcmp PROC C uses ebx edi, lpstr_l :DWORD, lpstr_r :DWORD
        
        mov edi, lpstr_l
        call _strlen_
        mov ebx, eax
        
        mov edi, lpstr_r
        call _strlen_
        
        cmp ebx, eax
        je equal
        jg great
        
        mov eax, -1
        jmp next
    equal:
        xor eax, eax
        jmp next    
    great:
        mov eax, 1  
    next:
        ret
        
    astrcmp endp 
    
    lab_function PROC SYSCALL uses edi esi ebx, lp_arr_Out :DWORD
        
        mov esi, ecx
        mov edi, edx
        mov ebx, lp_arr_Out
        
        call _strlen_
        
        lea ecx, [eax + 1]
        mov edx, eax
        xor eax, eax
        
    @@:
        repe cmpsb
        jecxz @F
            mov [ebx], edx
            sub [ebx], ecx
        add ebx, 4
        inc eax
        jmp @B
    @@:
        ret 4
 
    lab_function endp
end DllEntry
def файл..
Code
1
2
3
4
5
6
7
LIBRARY lab_dll
EXPORTS
    _strlen_ PRIVATE
    
    xstrlen         = astrlen   @101
    xstrcmp         = astrcmp   @102
    @lab_function@12    = lab_function   @103
2
ED
10 / 10 / 3
Регистрация: 06.04.2009
Сообщений: 93
06.01.2011, 16:05  [ТС]
C++
1
2
3
4
5
6
7
8
9
__declspec(dllexport) void func(
    DLLData *instance,
    NSFloat *data, 
    int rows,
    int cols
    )
{
    ..
}
по 1 варианту как такую функцию импортировать? если в длл библиотеки есть структури их тоже нужно импортировать?
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
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
 
template <typename T>
T _GetProcAddress(HINSTANCE h, const char *fun_name){
        T res = reinterpret_cast<T>(GetProcAddress(h, fun_name));
        if(!res) 
                printf("error load function: [ " + fun_name + " ]");
        return res;
}
 
void main(){
HINSTANCE hDll = LoadLibrary(TEXT("LINEARA.dll"));
if(!hDll) 
{
    printf("Couldn't load LINEARA.dll\n");
    system("pause");
    return;
}
...
}
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
06.01.2011, 17:44
Вот набросал пример. Думаю будет понятнее.
Код dll
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
31
32
33
34
35
36
37
38
39
40
41
#include <Windows.h>
 
typedef struct _BAR
{
    INT a1;
    INT a2;
}BAR, *PBAR;
 
VOID WINAPI _MY_FUNC(PBAR p)
{ 
    p->a1 += 10;
    p->a2 += 20;
} 
 
BOOL WINAPI DllMain(
                    HINSTANCE hinstDLL,  // handle to DLL module
                    DWORD fdwReason,     // reason for calling function
                    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason ) 
    { 
    case DLL_PROCESS_ATTACH:
        // Initialize once for each new process.
        // Return FALSE to fail DLL load.
        break;
 
    case DLL_THREAD_ATTACH:
        // Do thread-specific initialization.
        break;
 
    case DLL_THREAD_DETACH:
        // Do thread-specific cleanup.
        break;
 
    case DLL_PROCESS_DETACH:
        // Perform any necessary cleanup.
        break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}
def
Code
1
2
3
LIBRARY "dll"
EXPORTS
        MY_FUNC = _MY_FUNC @101
Подключаем так..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <Windows.h>
 
typedef struct _BAR
{
    INT a1;
    INT a2;
}BAR, *PBAR;
 
typedef VOID (WINAPI *MY_FUNC_PTR) (PBAR);
 
int main()
{
    HINSTANCE hDll = LoadLibrary(TEXT("dll.dll"));
    MY_FUNC_PTR my_func = (MY_FUNC_PTR)GetProcAddress(hDll, "MY_FUNC");
 
    BAR b; b.a1 = 10; b.a2 = 15;
    my_func(&b);
 
    std::cout << b.a1 << " " << b.a2 << std::endl;
 
    return 0;
}
1
ED
10 / 10 / 3
Регистрация: 06.04.2009
Сообщений: 93
07.01.2011, 11:57  [ТС]
непонел))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include "GLOBAL.h"
 
typedef void (WINAPI *func) (DLLData *instance,NSFloat*data,int rows,int cols);
//static NSFloat *getWeights(DLLData *instance);
//static NSFloat getFloatParameter(DLLData *instance, int row, int col);
 
void main(){
HINSTANCE hDll = LoadLibrary(TEXT("LINEARA.dll"));
if(!hDll) 
{
    printf("Couldn't load LINEARA.dll\n");
    system("pause");
    return;
}
XML
1
error C2564: 'func' : a function-style conversion to a built-in type can only take one argument
global.h
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifndef __GLOBAL_H__
#define __GLOBAL_H__
 
#pragma warning(disable : 4996)
 
#include <stdio.h>
#include <float.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
 
#define nil         NULL
#define YES         1
#define NO          0
#define MAX(x,y)    x>y?x:y;
#define PI          3.1415927
#define NSInt       int
#define NSUInt      UINT
#define NSLong      long
#define NSFloat     double
 
#define DLL_PARAM_ROWS  5
#define DLL_PARAM_COLS  3
 
#ifndef FALSE
#define FALSE       0
#endif
#ifndef TRUE
#define TRUE        1
#endif
#ifndef NULL
#define NULL        0
#endif
 
typedef int         BOOL;
 
typedef struct {
    NSFloat *data;
    int length;
} DLLWeights;
 
typedef struct {
    char parameters[DLL_PARAM_ROWS][DLL_PARAM_COLS][64];
    char parameterNames[DLL_PARAM_ROWS][DLL_PARAM_COLS][64];
    BOOL parameterReallocs[DLL_PARAM_ROWS][DLL_PARAM_COLS];
} DLLParameters;
 
typedef struct {
    DLLWeights *weights;
    DLLParameters *parameters;
    void *userData;
} DLLData;
 
typedef struct {
    void    *function,
            *constructor,
            *destructor;
    DLLData *instance;
} DLLStruct;
 
typedef DLLData     *(*DLL_Constructor)(DLLData *);
typedef void        (*DLL_Destructor)(DLLData *);
 
FILE *seekComponent(FILE *, const char *, unsigned int);
FILE *putComponent(FILE *, const char *, unsigned int);
//int max(int, int);
 
#endif // __GLOBAL_H__


C++
1
2
3
4
5
6
7
8
9
__declspec(dllexport) void func(DLLData *instance, NSFloat *data, int rows, int cols)
{
    int i,length=rows*cols;
    NSFloat *bias = getWeights(instance);
    NSFloat beta = getFloatParameter(instance, 2, 1);
 
    for (i=0; i<length; i++)
        data[i] = beta*data[i] + bias[i];
}
Добавлено через 14 часов 59 минут
мне етот .def файл нужно создать и зделать include?

Добавлено через 16 минут
подклучил етот деф файл в Linker->Input но сейчас ошибку показивает
C++
1
2
3
LIBRARY "LINEARA"
EXPORTS
myfunc = func
lineara.def : error LNK2001: unresolved external symbol func
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
07.01.2011, 12:20
http://msdn.microsoft.com/ru-r... s.90).aspx
http://msdn.microsoft.com/ru-r... s.90).aspx
0
ED
10 / 10 / 3
Регистрация: 06.04.2009
Сообщений: 93
07.01.2011, 17:37  [ТС]
в мсдн библиотеке уже читал но ето мне не помагло...
0
ED
10 / 10 / 3
Регистрация: 06.04.2009
Сообщений: 93
08.01.2011, 13:03  [ТС]
создал файл LINEARA.def
C++
1
2
3
LIBRARY LINEARA
EXPORTS
performAxon
подключил его


LINEARA.dll функции
#include "NSDLL.h"

/***********************************/
/* Forward activation of component */

__declspec(dllexport) void performAxon(
DLLData *instance, // Pointer to instance data
NSFloat *data, // Pointer to the layer of processing elements (PEs)
int rows, // Number of rows of PEs in the layer
int cols // Number of columns of PEs in the layer
)
{
int i,length=rows*cols;
NSFloat *bias = getWeights(instance);
NSFloat beta = getFloatParameter(instance, 2, 1);

for (i=0; i<length; i++)
data[i] = beta*data[i] + bias[i];
}

/**************************************** **/
/* Management of instance data (OPTIONAL) */

__declspec(dllexport) DLLData *allocAxon(
DLLData *oldInstance, // Pointer to the last instance if reallocating
int rows, // Number of rows of PEs in the layer
int cols // Number of columns of PEs in the layer
)
{
DLLData *instance = allocDLLInstance(oldInstance);
setParameterName(instance, 2, 1, "Beta", FALSE);
setFloatParameter(instance, 2, 1, 1.0f, FALSE);
setWeights(instance, rows*cols);
return instance;
}

__declspec(dllexport) void freeAxon(DLLData *instance)
{
freeDLLInstance(instance);
}

код начало программи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define DllExport __declspec(dllexport)
 
//extern "C" __declspec(dllexport) void performAxon(DLLData * instance,double*,int,int);
//typedef void (WINAPI *performAxon) (DLLData *instance,double*,int,int);
//static NSFloat *getWeights(DLLData *instance);
//static NSFloat getFloatParameter(DLLData *instance, int row, int col);
 
void main(){
HINSTANCE hDll = LoadLibrary(TEXT("LINEARA.dll"));
if(!hDll) 
{
    printf("Couldn't load LINEARA.dll\n");
    system("pause");
    return;
}
пробовал все. либо показивает link error либо identifier not found
0
ED
10 / 10 / 3
Регистрация: 06.04.2009
Сообщений: 93
09.01.2011, 23:50  [ТС]
так где все умные

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <Windows.h>
 
typedef void performAxon(
    DLLData *instance,
    NSFloat *data,
    int     rows,
    int     cols
    );
 
int main()
{
        HINSTANCE hDll = LoadLibrary(TEXT("LINEARA.dll"));
        MY_FUNC_PTR     my_func = (MY_FUNC_PTR)GetProcAddress(hDll, "performAxon");
 
 
        printf("aaaaaa\n");
 
        return 0;
}
что за MY_FUNC_PTR и как функцию правилно описать там где typedef
C
1
2
3
.\dlltest.cpp(9) : error C2062: type 'int' unexpected
.\dlltest.cpp(16) : error C2065: 'performAxon' : undeclared identifier
.\dlltest.cpp(16) : error C2146: syntax error : missing ';' before identifier 'GetProcAddress'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.01.2011, 23:50
Помогаю со студенческими работами здесь

Создание DLL библиотеки
Здравствуйте:) Мой вопрос связан с созданием dll библиотеки в visual studio 2008 на с++. У меня в VS есть проект рабочей программы,...

Создание динамической библиотеки dll
Господа, есть такая утилита - potrace называется, она есть в свободном доступе и нужно из неё сделать динамическую библиотеку. Для...

Как подключать dll библиотеки в VS
Когда подключал opencv нужно было просто указать пути к заголовочным и lib файлам. Но вот скачал другую библиотеку, а там никаких .lib и...

Создание библиотеки ресурсов dll
Здравствуйте! Программа использует много графических ресурсов, потому хотелось бы &quot;запихнуть&quot; их в отдельную библиотеку dll и...

Динамически подключаемые библиотеки DLL в WIN32
Написать программу, реализующую DLL модуль для явной компоновки в режимах: • автоматической загрузки DLL; • загрузки DLL с помощью...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru