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

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

06.01.2011, 14:55. Показов 6368. Ответов 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
1465 / 966 / 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
1465 / 966 / 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
1465 / 966 / 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
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-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru