powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / GetProcAddress, подскажите как нужно писать?
6 сообщений из 6, страница 1 из 1
GetProcAddress, подскажите как нужно писать?
    #39067592
Фотография MMM_Corp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Пишу небольшую софтину на чистом С. Возникли проблемы в незнании синтаксиса С. Не могу разобратся как коректно импортировать функцию с нормальным именем. Интересует как динамически использовать. Прошу помочь.

итак есть файл (содержание обрезано) dgl.h :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
BOOL dglInit();
BOOL dlgUnInit();

typedef void (*LPFNGETSTRINGLENGTH1)(GLenum mode);

//typedef int     (_cdecl* LPFNGETSTRINGLENGTH1)      (PCWSTR);

//void (*glBegin)(GLenum mode);

//void glBegin(GLenum mode);

//extern lpfnGetStringLength1 glBegin;
void (*glEnd)();



в нем пытаюсь описать функцию glBegin (грубо говоря хочу переделать работу с OpenGL на вызов динамичеки функцый), но не получается, постоянно какиэто ошибки...

dlg.c:
Код: plaintext
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.
#include <windows.h>
#include "dgl.h"

HMODULE GLHandle = NULL;
//typedef void (*PFNSOMEFUNC)(GLenum mode);
//typedef void (*LPFNGETSTRINGLENGTH1)(GLenum mode);
//PROC WINAPI(*winglGetProcAddress)(LPCSTR);

BOOL dglInit(){
	GLHandle = LoadLibrary("opengl32.dll");

	//DIRECT3DCREATE9 Direct3DCreate9;
	//Direct3DCreate9 = (DIRECT3DCREATE9) GetProcAddress(library,"Direct3DCreate9");

	if (GLHandle != NULL){
		LPFNGETSTRINGLENGTH1 lpfnGetStringLength1 = (LPFNGETSTRINGLENGTH1) GetProcAddress(GLHandle, "glBegin");


		
		// glBegin  = (PROC WINAPI(*)(LPCSTR))GetProcAddress(GLHandle, "glBegin");
	
	}
	// TODO: del
	else 
		MessageBox(0, "Error load opengl32.dll !", "Error", MB_ICONERROR);
	return GLHandle != NULL;
}

BOOL dlgUnInit(){
	//CloseHandle(hgl);
	return FreeLibrary(GLHandle);
}



main.c
Код: plaintext
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.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
#pragma region Includes and defines

#define WINVER 0x0500   // version 5.0, XP
#define gldynamic	// use dynamic OpenGL

#include <windows.h>

#ifdef gldynamic
	#include "dgl.h"
#else 
	#include <gl\GL.h>
#endif

#pragma endregion


LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
void DisableOpenGL(HWND, HDC, HGLRC);

int DrawGLScene1(GLvoid);

HDC	hDC = NULL;		// Private GDI Device Context
float theta;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wcex;
    HWND hwnd;
    // HDC hDC;
    HGLRC hRC;
    MSG msg;
    BOOL bQuit = FALSE;
    float theta = 0.0f;

    /* register window class */
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_OWNDC;
    wcex.lpfnWndProc = WindowProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "GLSample";
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);;


    if (!RegisterClassEx(&wcex))
        return 0;

    /* create main window */
    hwnd = CreateWindowEx(0,
                          "GLSample",
                          "OpenGL Sample",
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT,
                          CW_USEDEFAULT,
                          256,
                          256,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

    ShowWindow(hwnd, nCmdShow);

    /* enable OpenGL for the window */
	dglInit();
	//glBegin();

    EnableOpenGL(hwnd, &hDC, &hRC);

    /* program main loop */
    while (!bQuit)
    {
        /* check for messages */
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            /* handle or dispatch messages */
            if (msg.message == WM_QUIT)
            {
                bQuit = TRUE;
            }
            else
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else
        {
			DrawGLScene1();
        }
    }

    /* shutdown OpenGL */
    DisableOpenGL(hwnd, hDC, hRC);

    /* destroy the window explicitly */
    DestroyWindow(hwnd);

    return msg.wParam;
}

int DrawGLScene1(GLvoid)		// Here's Where We Do All The Drawing
{
            /* OpenGL animation code goes here */

/*
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            glClear(GL_COLOR_BUFFER_BIT);

            glPushMatrix();
            glRotatef(theta, 0.0f, 0.0f, 1.0f);

			glRotatef(theta, 1.0f+theta,0.0f, -6.0f+theta);  
*/
//	MYPROC("dffsf");
			lpfnGetStringLength1(GL_TRIANGLES);	// no work
			glBegin(GL_TRIANGLES);				// i wont this use, no work... how fix???
            //glBegin(GL_TRIANGLES);		
//                glColor3f(1.0f, 0.0f, 0.0f);   glVertex2f(0.0f,   1.0f);
//                glColor3f(0.0f, 1.0f, 0.0f);   glVertex2f(0.87f,  -0.5f);
//                glColor3f(0.0f, 0.0f, 1.0f);   glVertex2f(-0.87f, -0.5f);		
            //glEnd();

/*
            glPopMatrix();

            SwapBuffers(hDC);
*/
            theta += 1.0f;
            Sleep (1);

	return TRUE;
}

void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC)
{
    PIXELFORMATDESCRIPTOR pfd;

    int iFormat;

    /* get the device context (DC) */
    *hDC = GetDC(hwnd);

    /* set the pixel format for the DC */
    ZeroMemory(&pfd, sizeof(pfd));

    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW |
                  PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;

    iFormat = ChoosePixelFormat(*hDC, &pfd);

    SetPixelFormat(*hDC, iFormat, &pfd);

    /* create and enable the render context (RC) */
    *hRC = wglCreateContext(*hDC);

    wglMakeCurrent(*hDC, *hRC);
}

void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hRC);
    ReleaseDC(hwnd, hDC);
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CLOSE:
            PostQuitMessage(0);
        break;

        case WM_DESTROY:
            return 0;

        case WM_KEYDOWN:
        {
            switch (wParam)
            {
                case VK_ESCAPE:
                    PostQuitMessage(0);
                break;
            }
        }
        break;

        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }

    return 0;
}



прикрепляю проэкт под 2010 студию
...
Рейтинг: 0 / 0
GetProcAddress, подскажите как нужно писать?
    #39067605
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetProcAddress() может не вернуть адрес. Надо проверять что она вернула.

PS Весь свой проект не обязательно выкладывать. Достаточно строки на которой ошибка происходит и небольшого куска кода для понимания что откуда в проблемной строке взялось.
...
Рейтинг: 0 / 0
GetProcAddress, подскажите как нужно писать?
    #39067606
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй это
Код: plaintext
1.
typedef void (*LPFNGETSTRINGLENGTH1)(GLenum mode);


заменить на
Код: plaintext
1.
typedef void (WINAPI *LPFNGETSTRINGLENGTH1)(GLenum mode);
...
Рейтинг: 0 / 0
GetProcAddress, подскажите как нужно писать?
    #39067896
Фотография MMM_Corp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПопробуй это
Код: plaintext
1.
typedef void (*LPFNGETSTRINGLENGTH1)(GLenum mode);


заменить на
Код: plaintext
1.
typedef void (WINAPI *LPFNGETSTRINGLENGTH1)(GLenum mode);



помогло, большое спасибо!!!
...
Рейтинг: 0 / 0
GetProcAddress, подскажите как нужно писать?
    #39068372
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MMM_Corp,

А вот меня удивляют всегда такие люди, которые имеют "проблемы в незнании синтаксиса С", но почему-то сразу хотят обязательно что-то импортировать из .DLL динамически...

На кой ?
...
Рейтинг: 0 / 0
GetProcAddress, подскажите как нужно писать?
    #39073706
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MMM_Corp,

Рекомендую
"Windows для профессионалов" Джеффри Рихтер
Там всё разжовано, очень коротко и грамотно по WinAPI

удачи Вам
(круглый)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / GetProcAddress, подскажите как нужно писать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]