Ошибка несовместимости. Как подключить DLL?
18.06.2015, 02:02. Показов 411. Ответов 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
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
85
86
87
88
89
90
91
92
93
94
95
96
| #include <glut.h>
#include <math.h>
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <gl\GL.h>
#include <gl\GLU.h>
using namespace std;
#define PI 3.14159265359
#define n 11
typedef void (*fptrInt2)(int, int);
typedef void (*fptrInt3)(int,int, int);
typedef void (*fptrNull)();
int ox=0,oy=0,oz=100;
float radius = 50.0;
HMODULE LoadWorldLibrary();
void FreeWorldLibrary(HMODULE world_module);
void InitializeGlutWindow(int argc, char** argv);
bool InstallGlutFuncs(HMODULE world_module);
void PerformGlutLoop();
void FreeGlut();
int main(int argc, char** argv) {
InitializeGlutWindow(argc, argv);
HMODULE world_module = LoadWorldLibrary();
if (world_module) {
if (InstallGlutFuncs(world_module)) {
PerformGlutLoop();
}
FreeWorldLibrary(world_module);
}
FreeGlut();
return 0;
}
void InitializeGlutWindow(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400);
glutInitWindowPosition(483, 184);
glutCreateWindow("Prizma");
}
HMODULE LoadWorldLibrary() {
const TCHAR* const kWorldLibrary = TEXT("Win32Project1.dll");
HMODULE world_module = ::LoadLibrary(kWorldLibrary);
if (!world_module) {
::MessageBox(NULL, TEXT("The library ") TEXT(" is not loaded."), TEXT("Foo"), MB_OK);
}
return world_module;
}
void FreeWorldLibrary(HMODULE world_module) {
FreeLibrary(world_module);
}
bool InstallGlutFuncs(HMODULE world_module) {
typedef void (* InitializeFunc());
typedef void (* DisplayFunc());
typedef void (* MousePresedMoveFunc(int, int));
typedef void (* SKeyboardFunc(int, int, int));
InitializeFunc* init_func (InitializeFunc);GetProcAddress(world_module, "Initialize");
DisplayFunc* display_func (DisplayFunc);GetProcAddress(world_module, "Display");
MousePresedMoveFunc* mouse_presed_move_func (MousePresedMoveFunc);GetProcAddress(world_module, "MousePresedMove");
SKeyboardFunc* skeyboard_func (SKeyboardFunc);GetProcAddress(world_module, "SKeyboard");
bool is_succeeded = init_func && display_func && mouse_presed_move_func && skeyboard_func;
if (is_succeeded) {
init_func();
glutMotionFunc(mouse_presed_move_func);
glutSpecialFunc(skeyboard_func);
glutDisplayFunc(display_func);
} else {
::MessageBox(NULL, TEXT("Problems with library, can't find functions."), TEXT("Foo"), MB_OK);
}
return is_succeeded;
}
void PerformGlutLoop() {
glutMainLoop();
}
void FreeGlut() {
} |
|
Библиотека DLL с которой должна работать программа:
stdafx.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
| // stdafx.h: включаемый файл для стандартных системных включаемых файлов
// или включаемых файлов для конкретного проекта, которые часто используются, но
// не часто изменяются
//
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Исключите редко используемые компоненты из заголовков Windows
// Файлы заголовков Windows:
#include <windows.h>
#ifdef Win32Project1_DLL_EXPORT
#define Win32Project1DLL_GLOBAL extern "C" __declspec(dllexport)
#else
#define Win32Project1_GLOBAL extern "C" __declspec(dllimport)
#endif
Win32Project1_GLOBAL void Display();
Win32Project1_GLOBAL void MousePresedMove(int x, int y);
Win32Project1_GLOBAL void SKeyboard(int key, int x, int y);
Win32Project1_GLOBAL void Initialize();
// TODO: Установите здесь ссылки на дополнительные заголовки, требующиеся для программы |
|
Win32Project1.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
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
| // Win32Project1.cpp: определяет экспортированные функции для приложения DLL.
//
#include "stdafx.h"
#include <glut.h>
#include <math.h>
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <gl\GL.h>
#include <gl\GLU.h>
using namespace std;
#define PI 3.14159265359
#define n 11
typedef void (*fptrInt2)(int, int);
typedef void (*fptrInt3)(int,int, int);
typedef void (*fptrNull)();
int ox=0,oy=0,oz=100;
float radius = 50.0;
void Display() {
float segment = 2*PI / n;
struct point
{
float x,y,z;
} a[n+1],b[n+1];
for(int i=0;i<=n;i++){
float x = radius * sin(i*segment);
float y = radius * cos(i*segment);
a[i].x=x;
a[i].y=y;
a[i].z=oz;
b[i].x=x;
b[i].y=y;
b[i].z=-oz;};
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(90,1,0,0);
glEnable(GL_DEPTH_TEST);
glBegin(GL_QUADS);
for (int i=0;i<n;i++)
{
glColor3f(sinf(i),sinf(i+5),sinf(i+2));
glVertex3f(a[i].x,a[i].y,a[i].z);
glVertex3f(a[i+1].x,a[i+1].y,a[i+1].z);
glVertex3f(b[i+1].x,b[i+1].y,b[i+1].z);
glVertex3f(b[i].x,b[i].y,b[i].z);
};
glVertex3f(a[0].x,a[0].y,a[0].z);
glVertex3f(a[n-1].x,a[n-1].y,a[n-1].z);
glVertex3f(b[n-1].x,b[n-1].y,b[n-1].z);
glVertex3f(b[0].x,b[0].y,b[0].z);
glEnd();
glBegin(GL_LINE_STRIP);
for(int i=0;i<=n;i++)
{
glColor3f(0,0,0);
glVertex3f(a[i].x,a[i].y,a[i].z);
};
glEnd();
glBegin(GL_LINE_STRIP);
for(int i=0;i<=n;i++)
{
glColor3f(0,0,0);
glVertex3f(b[i].x,b[i].y,b[i].z);
}
glEnd();
glBegin(GL_LINE_STRIP);
for (int i=0;i<=n;i++)
{
glColor3f(0,0,0);
glVertex3f(a[i].x,a[i].y,a[i].z);
glVertex3f(b[i].x,b[i].y,b[i].z);
glVertex3f(a[i].x,a[i].y,a[i].z);
}
glEnd();
glPopMatrix();
glutSwapBuffers();
}
void MousePresedMove(int x, int y){
if((x>=0&&x<=400)&&(y>=0&&y<=400))
{
glutPostRedisplay();
glRotatef (x-ox,0,1,0);
glRotatef (y-oy,-1,0,0);
ox=x; oy=y;
}
}
void SKeyboard(int key, int x, int y){
switch(key)
{
case GLUT_KEY_UP: { if (oz!=250) {radius++; oz=oz+2;
glutPostRedisplay();}}
break;
case GLUT_KEY_DOWN: { if (oz!=0) {radius--; oz=oz-2;
glutPostRedisplay();}}
break;
}
}
void __declspec(dllexport) Initialize(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-200,200,200,-200,-500,500);
glMatrixMode(GL_MODELVIEW);
// pMouse = MousePresedMove;
} |
|
В библиотеке вроде всё правильно( ошибок нету ), а в программе выдаёт ошибки:
| C++ | 1
2
3
4
5
6
7
8
9
10
11
| 1>------ Построение начато: проект: Призма, Конфигурация: Debug Win32 ------
1> Исходный код.cpp
1>c:\users\дима\documents\visual studio 2012\projects\призма\призма\исходный код.cpp(77): warning C4551: в вызове функции отсутствует список аргументов
1>c:\users\дима\documents\visual studio 2012\projects\призма\призма\исходный код.cpp(79): error C2660: init_func: функция не принимает 0 аргументов
1>c:\users\дима\documents\visual studio 2012\projects\призма\призма\исходный код.cpp(81): error C2664: glutMotionFunc: невозможно преобразовать параметр 1 из "MousePresedMoveFunc (__cdecl *(__cdecl *)(MousePresedMoveFunc (__cdecl *)))" в "void (__cdecl *)(int,int)"
1> Конечному типу не соответствует ни одной функции с данным именем в области видимости
1>c:\users\дима\documents\visual studio 2012\projects\призма\призма\исходный код.cpp(82): error C2664: glutSpecialFunc: невозможно преобразовать параметр 1 из "SKeyboardFunc (__cdecl *(__cdecl *)(SKeyboardFunc (__cdecl *)))" в "void (__cdecl *)(int,int,int)"
1> Конечному типу не соответствует ни одной функции с данным именем в области видимости
1>c:\users\дима\documents\visual studio 2012\projects\призма\призма\исходный код.cpp(83): error C2664: glutDisplayFunc: невозможно преобразовать параметр 1 из "DisplayFunc (__cdecl *(__cdecl *)(DisplayFunc (__cdecl *)))" в "void (__cdecl *)(void)"
1> Конечному типу не соответствует ни одной функции с данным именем в области видимости
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== |
|
Добавлено через 10 минут
Попробовал вот так всё равно не получается
| C++ | 1
2
3
4
| InitializeFunc init_func = reinterpret_cast<InitializeFunc>(::GetProcAddress(world_module, "Initialize"));
DisplayFunc display_func = reinterpret_cast<DisplayFunc>(::GetProcAddress(world_module, "Display"));
MousePresedMoveFunc mouse_presed_move_func = reinterpret_cast<MousePresedMoveFunc>(::GetProcAddress(world_module, "MousePresedMove"));
SKeyboardFunc skeyboard_func = reinterpret_cast<SKeyboardFunc>(::GetProcAddress(world_module, "SKeyboard")); |
|
0
|