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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
#1

Почему нельзя переделать dll в exe, изменив входную функцию? - C++

08.03.2013, 00:13. Просмотров 480. Ответов 4
Метки нет (Все метки)

Да почему?
Прикладываю проект, он очень прост. Вот на всякий случай код *.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdafx.h"   
#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
 
 
//int main () {
//    return 0;
//}
 
BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                               ){
    return TRUE;
}
 
 
int DllGetClassObject(){
   return 0;
}
Скомпильте, скомпилится без ошибок. А теперь вместо DllMain подставьте main (она пока закомпилена), ага. Ошибок ТАКЖЕ не будет, как не будет и экзешника, а как была dll-ка, так и останется.

В чём дело? Если компилятор берёт на себя смелость распознавать конечный проект по прототипу входной функции (компилит ведь без ошибок), почему же он его не кропает, конечный проект-то?

Спасибо, кто откликнется.
Вложения
Тип файла: rar dll_i_exe.rar (5.65 Мб, 4 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 00:13     Почему нельзя переделать dll в exe, изменив входную функцию?
Посмотрите здесь:

Почему нельзя объявить указатель на шаблонную структуру? C++
Как из DLL вызвать функцию, находящуюся в exe? C++
Почему таким способом нельзя создать массив? C++
C++ Почему нельзя компилировать отдельный заголовочный файл?
Почему функцию sqrt нельзя применять к int переменным, а только к double и flot? C++
C++ Почему нельзя так объявить двумерный массив?
C++ Почему break нельзя использовать в if?
C++ Почему в switch нельзя определять переменные?
Почему нельзя подставлять переменные в выражения #if #else? C++
C++ Почему нельзя написать просто - using namespace boost;
C++ Почему два char нельзя сравнивать так ==?
C++ Почему нельзя выделить статически кусок в ~100 MB?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
08.03.2013, 00:24  [ТС]     Почему нельзя переделать dll в exe, изменив входную функцию? #2
А, разобрался, там в свойствах проекта надо было указать что на выходе ожидается *.exe
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.03.2013, 00:24     Почему нельзя переделать dll в exe, изменив входную функцию? #3

Не по теме:

когда передаешь кому-то проект студии то удаляй файл *.sdf, а так же папки Debug/Release/ipch


Цитата Сообщение от kravam Посмотреть сообщение
Скомпильте, скомпилится без ошибок. А теперь вместо DllMain подставьте main (она пока закомпилена), ага. Ошибок ТАКЖЕ не будет, как не будет и экзешника, а как была dll-ка, так и останется.
а с чего бы должен появится экзешник? имя точки входа никак не влияет на то что будет в результате экзешник или длл
Avazart
 Аватар для Avazart
7037 / 5214 / 259
Регистрация: 10.12.2010
Сообщений: 22,918
Записей в блоге: 17
08.03.2013, 02:23     Почему нельзя переделать dll в exe, изменив входную функцию? #4
Ну а ты с консоли(ручками) компилируешь что ли ?
-Нет вот и загляни в файл проекта dll и обычного проекта, найди отличия...
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
08.03.2013, 02:32  [ТС]     Почему нельзя переделать dll в exe, изменив входную функцию? #5
Jupiter,
Я бы по-другому объяснил.
Если задать задание создать*.dll, тогда компоновщик будет искать такую функцию:

C++
1
2
3
BOOL APIENTRY DllMain( HANDLE hModule, 
//                       DWORD  ul_reason_for_call, 
//                       LPVOID lpReserved)                            )
Если он её не находит, оно просто подставляет вместо неё стандартную (по аналогии с конструктором по умолчанию для классов. Если программист не написал конструктор, компилятор подставит встроенный), и в этом случае ВСЕ ОСТАЛЬНЫЕ функции НЕ РАССМАТРИВАЮТСЯ как кандидаты на точку входа. И всё равно, main- не main. Вышеуказанной функции нет- подставляется встроенная.

А main (если есть) в этом случае рассматривается как ОДНА ИЗ рядовых функций. Это мой случай. Я думал что она и будет точкой входа и ожидал, что соответственно создастся экзешник, но я ошибался.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
Ну а ты с консоли(ручками) компилируешь что ли ?
-Нет вот и загляни в файл проекта dll и обычного проекта, найди отличия...
чего?
Yandex
Объявления
08.03.2013, 02:32     Почему нельзя переделать dll в exe, изменив входную функцию?
Ответ Создать тему
Опции темы

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