24|undefined reference to `__imp_SaveDC'|

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Видимо имеет в виду #pragma которая доступна в студии, и которая не является кроссплатформенной, а потому не работает в MinGW.
Нет. Ни у Чалза в книге, ни у меня в исходниках нет вообще ни одного упоминания прагмы. Бибюлиотеки грузятся LoadLibrary, освобождаются FreeLibrary, а адреса берутся GetProcAdress.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Господи, а при чём тут динамическая линковка? Сионист, ты меня удивляешь в очередной раз. Ты ведь сам тему создал о статической линковке... И две страницы сообщений тоже было исключительно о статической линковке исписано. И тут на тебе... Похоже, ты не видишь разницы, раз умудрился заговорить о LoadLibrary.

Очень советую, обнови знания об этом разделе. На данный момент они у тебя крайне запутаны.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Код: Выделить всё

#include <windows.h>
LRESULT CALLBACK                 MainWindowWProcedure                    (      HWND                    Window               ,
                                                                                     UINT                    Message              ,
                                                                                     WPARAM                  First                ,
                                                                                     LPARAM                  Second               )
{
 switch (Message)
 {
    case WM_DESTROY: PostQuitMessage(0);
  break;
 }
}
typedef HGDIOBJ (*TGetStockObject)(int);
TGetStockObject __imp_GetStockObject;

HMODULE Lib;

int     WINAPI                   WinMain                                      (      HINSTANCE               Instance            ,
                                                                                     HINSTANCE               Previus             ,
                                                                                     PSTR                    CommandLine         ,
                                                                                     int                     Show                )
{
 WNDCLASSEX WindowClass;
 Lib=LoadLibrary(L"GDI32.dll");
 __imp_GetStockObject=(TGetStockObject)GetProcAddress(Lib, "GetStockObject");
 WindowClass.cbSize       =sizeof(WindowClass);
 WindowClass.style        =CS_HREDRAW|
                           CS_VREDRAW;
 WindowClass.lpfnWndProc  =MainWindowWProcedure;
 WindowClass.cbClsExtra   =0;
 WindowClass.cbWndExtra   =0;
 WindowClass.hInstance    =Instance;
 WindowClass.hIcon        =LoadIcon(NULL, IDI_APPLICATION);
 WindowClass.hCursor      =LoadCursor(NULL, IDC_CROSS);
 WindowClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WindowClass.lpszMenuName =L"App.";
 WindowClass.lpszClassName=L"App.";
 WindowClass.hIconSm      =LoadIcon(NULL, IDI_APPLICATION);
 RegisterClassEx(&WindowClass);
  MSG Message;
  HWND MainWindow;
 MainWindow=CreateWindow(L"App.",
                         L"App."              ,
                         WS_OVERLAPPEDWINDOW  ,
                         CW_USEDEFAULT        ,
                         CW_USEDEFAULT        ,
                         CW_USEDEFAULT        ,
                         CW_USEDEFAULT        ,
                         NULL                 ,
                         NULL                 ,
                         Instance             ,
                         NULL                 );
 ShowWindow(MainWindow, Show);
 UpdateWindow(MainWindow);
 while (GetMessage(&Message, NULL, 0, 0))
 {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 FreeLibrary(Lib);
 return 0;
}
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Дай угадаю. Видимо, ты не прочёл мой предыдущий пост. То есть, помимо непрофессионализма демонстрируешь ещё и невнимательность.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

DLL линкуются динамически, то есть на этапе исполнения, а значит и на целевой машине, где линкера просто нет. Более того, прилада может много раз линковать и отлиновывать разные DLL в зависимости от того, когда и какие нужны функции. Кроме того, линкером то линкуется конкретный исполняемый файл, а DLL загружается и выгружается в зависимости от потребностей многих прилад. Одна прилада загрузилась, ей нужна DLL, DLL загрузилась, вторая прилада загрузилась, ей тоже нужна эта же DLL, потом первая закрылась, DLL остаётся в памяти, но она была в памяти в одном экземпляре, когда исполнялись обе прилады.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Дай угадаю. Видимо, ты не прочёл мой предыдущий пост. То есть, помимо непрофессионализма демонстрируешь ещё и невнимательность.
В отличие от тебя прочитал.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Господи, а при чём тут динамическая линковка? Сионист, ты меня удивляешь в очередной раз. Ты ведь сам тему создал о статической линковке...
Бред. DLL линкуются динамически.
И две страницы сообщений тоже было исключительно о статической линковке исписано.
Статическая линковка упомянута лишь дважды, да и то в контексте во-первых линковки библиотек импорта, а не целевых библиотек, а во-вторых ещё и отказа от неё. Зато в первом же посте:
Можно ли GDI32.dll загрузить явно GDI32.dll загрузить явно
. Так что именно ты умудрился из всей темы прочитать единственное слово.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):Бред. DLL линкуются динамически.
Погоди. То есть когда ты указываешь в списке линковки, какую библиотеку залинковать (а именно так у тебя было сделано в первом посте данной темы), то если это DLL, то линковка сразу становится динамической? Ты просто даже не понимаешь сейчас насколько сильно втаптываешь себя в грязь.

Совет - погугли о том, что такое динамическая и статическая линковка, внимательно прочти пару статеек, а потом продолжим обсуждение, если оно ещё будет актуально. А пока не прочёл, лучше просто молчи. Это лучше, чем подобным образом показывать своё невежество.

И да, ответ на твой вопрос - DLL можно линковать как статически, там и динамически. В первом посте, где ты жаловался на ошибки линкера, происходит как раз статическая линковка.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Погоди. То есть когда ты указываешь в списке линковки, какую библиотеку залинковать (а именно так у тебя было сделано в первом посте данной темы), то если это DLL, то линковка сразу становится динамической?
Нет. Она не становится статической. Статически линкуется лишь код, отвечающий за загрузку и освобождение DLL и инициализацию указателей на библиотечные функции + сами указатели, но не сама DLL, тема о том, как этот код написать явно и явно объявить указатели на функции. DLL же в любом случае загружается на этапе исполнения. И если файл DLL на целевой функции отсутствует, то статическая линковка библиотеки импорта свойствами проекта не поможет, прога всё равно не будет работать.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Совет - погугли о том, что такое динамическая и статическая линковка, внимательно прочти пару статеек
Что жалка пара стаек добавит к десяткам тысяч таких же статеек, но уже прочитанных и к тысячам книг?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить