Форум программистов, компьютерный форум CyberForum.ru

подключение dll - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
stels
 Аватар для stels
2 / 1 / 0
Регистрация: 02.04.2009
Сообщений: 28
13.02.2010, 23:29     подключение dll #1
Подскажите в чем проблема
Текст Prog.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
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
 
typedef void (*cfunc)();
 
cfunc NumberList;
void main()
{
   HINSTANCE hLib=LoadLibrary("dllname.DLL");
    
    NumberList=(cfunc)GetProcAddress((HMODULE)hLib, "NumberList");
 
    if(NumberList==NULL) 
    {
       cout << "Unable to load function(s)." << endl;
       FreeLibrary((HMODULE)hLib);
       return;
    }
    NumberList();
 
    FreeLibrary((HMODULE)hLib);
    getch();
}
Текст dll.h
C++
1
2
3
4
5
#include <iostream.h>
#include <stdio.h>
#include <windows.h>
 
extern "C" __declspec(dllexport) void NumberList();
Текст dll.cpp
C++
1
2
3
4
5
6
7
#include "dll.h"
 
 
extern "C" __declspec(dllexport) void NumberList()
{
    cout<< 12;
}
При компиляции Prog.cpp выводит ошибки:
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.


Добавлено через 11 часов 13 минут
проблему решил!
но возникла другая: как загнать форму в 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
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
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL InitApplication(HINSTANCE hInctance);
BOOL InitInctance(HINSTANCE hInstance, int nCmdShow);
LPCSTR szClassName="FrameWndAPI";
LPCSTR szTitle="aaaaaaaaaaaaaaaaa" "adssssss";
 
BOOL InitApplication (HINSTANCE hInstance)
{   typedef struct tagWNDCLASSA
    {
        UINT style;
        WNDPROC lpfnWndProc;
        int cbClsExtra;
        int cbWndExtra;
        HINSTANCE hInstance;
        HICON hIcon;
        HCURSOR hCursor;
        HBRUSH hbrBackground;
        LPCSTR lpszMenuName;
        LPCSTR lpszClassName;
    }WNDCLASS;
 
    WNDCLASS wc;
    wc.style=CS_HREDRAW|CS_VREDRAW;
    wc.lpfnWndProc=static_cast<WNDPROC>(WndProc);
    wc.cbClsExtra=0;
    wc.cbClsExtra=0;
    wc.hInstance=hInstance;
    wc.hIcon=LoadIcon(NULL, IDI_ASTERISK);
    wc.hCursor=LoadCursor(NULL, IDC_CROSS);
    wc.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
    wc.lpszMenuName=NULL;
    wc.lpszClassName=szClassName;
    return RegisterClass(&wc);   
 
    BOOL InitInstance(
                  HINSTANCE hInstance,
                  int nCmdShow);
    HWND hWnd;
    hWnd=CreateWindow(
              szClassName,
              szTitle,
              WS_OVERLAPPEDWINDOW,
              CW_USEDEFAULT,
              CW_USEDEFAULT,
              CW_USEDEFAULT,
              CW_USEDEFAULT,
              NULL,
              NULL,
              hInstance,
              NULL);
    if(!hWnd) return FALSE;
    if(!ShowWindow(hWnd,nCmdShow))return FALSE;
    if(!UpdateWindow(hWnd))return FALSE;
    return TRUE;
}
LRESULT CALLBACK WndProc(
     HWND hwnd,
     UINT message,
     WPARAM wParam,
     LPARAM lParam)
{
    switch(message)
    {
        case WM_DESTROY:    PostQuitMessage(0); break;
        default: return DefWindowProc(hwnd, message,wParam,lParam);
    }
        return 0;
}
 
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    if(!hPrevInstance)
    {
        if(!InitApplication(hInstance)) return FALSE;
    }
    if (!InitInstance(hInstance,nCmdShow)) return FALSE;
    MSG msg;
    while (GetMessage(&msg, NULL,0,0))// TODO: Place code here.
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return static_cast<int>(msg.wParam);
}
вот ошибки:
e:\lab1\1\1.cpp(37) : error C2664: 'RegisterClassA' : cannot convert parameter 1 from 'struct InitApplication::tagWNDCLASSA *' to 'const struct tagWNDCLASSA *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
e:\lab1\1\1.cpp(56) : error C2065: 'nCmdShow' : undeclared identifier
e:\lab1\1\1.cpp(83) : error C2065: 'InitInstance' : undeclared identifier

в чем проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2010, 23:29     подключение dll
Посмотрите здесь:

C++ Статическое подключение DLL
подключение dll C++
Подключение dll библиотеки C++
C++ Подключение dll в MSVS 2010 C++
Подключение dll - ошибка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
14.02.2010, 11:25     подключение dll #2
По поводу первой ошибки - а НАХУА ты определяешь структуру заново, да ещё и внутри функции? Разумеется, она считается несовместимой с той, которая требуется и не имеет к ней никакого отношения. Даже несмотря на совпадение названий и полей. Пользуйся готовой, той, что объявлена в <windows.h>.
Далее, внутри InitApplication идентификатор nCmdShow неизвестен - ты же получаешь его в WinMain и не заботишься о том, чтобы сообщить его своей InitApplication.
Ну и наконец ты форвардишь функцию InitInstance внутри InitApplication. Это значит, что сия декларация действительна только в пределах этой функции. И WinMain о ней ничего не знает.

Может, тебе рано осваивать все эти виндовые штучки, если ты с элементарными вещами путаешься? Может, стоит сначала подтянуть знание языка?
stels
 Аватар для stels
2 / 1 / 0
Регистрация: 02.04.2009
Сообщений: 28
14.02.2010, 18:23  [ТС]     подключение dll #3
тогда может накинешь как оно должно быть, а я-то уж постараюсь подтянуть свои знания!
stels
 Аватар для stels
2 / 1 / 0
Регистрация: 02.04.2009
Сообщений: 28
15.02.2010, 21:52  [ТС]     подключение dll #4
нарахунок формы я уже разобрался как оно и куда (она уже работает)! но как ее загнать в DLL чтобы потом было можно оттуда ее вызывать?
на DELPHI это выглядело как-то примерно так:
Delphi
1
2
3
4
DynamicForm:= ТDynamicForm.Create(nil);
DynamicForm.ShowModal();
DynamicForm.Free;
    DynamicForm:=nil;
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
16.02.2010, 20:01     подключение dll #5
Судя по всему, ты хочешь показывать диалоговое окно. Загони его в эту DLL (нарисуй редактором ресурсов), напиши там же диалоговую процедуру к нему и экспортируй функцию, которая запускает сей диалог через DialogBox или родственников, ну и по мере надобности получает оттуда данные. Принцип работы диалоговой процедуры ты, надеюсь, уже знаешь - там обрабатываются события, приходящие в диалог, в том числе и события элементов управления (controls).
Yandex
Объявления
16.02.2010, 20:01     подключение dll
Ответ Создать тему
Опции темы

Текущее время: 16:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru