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

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

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

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

08.03.2013, 00:13. Просмотров 493. Ответов 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, изменив входную функцию?
Посмотрите здесь:

Почему функцию sqrt нельзя применять к int переменным, а только к double и flot? - C++
Почему функцию sqrt нельзя применять к int переменным, а только к double и float? Извините за опечатку в названии темы.

Как из DLL вызвать функцию, находящуюся в exe? - C++
Плз. скажите, как из DLL вызвать функцию, находящуюся в exe'шнике. Плз.! Плз.! Плз.!

Почему break нельзя использовать в if? - C++
почему break нельзя использовать в if вот код if(f.eof()==1) { break; } про break MVS говорит что ОПЕРАТОР break...

Почему нельзя подставлять переменные в выражения #if #else? - C++
Почему код работает, не должен же, потому что выражение стоящее после #if вычисляется на этапе компиляции, переменные подставлять нельзя?? ...

Почему в switch нельзя определять переменные? - C++
int main() { setlocale(LC_ALL, &quot;Russian&quot;); int n; std::cout &lt;&lt; &quot;Введите число: &quot;; std::cin &gt;&gt; n; switch...

Почему два char нельзя сравнивать так ==? - C++
Почему два char нельзя сравнивать так ==?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
08.03.2013, 00:24  [ТС]     Почему нельзя переделать dll в exe, изменив входную функцию? #2
А, разобрался, там в свойствах проекта надо было указать что на выходе ожидается *.exe
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,401
Записей в блоге: 17
08.03.2013, 02:23     Почему нельзя переделать dll в exe, изменив входную функцию? #4
Ну а ты с консоли(ручками) компилируешь что ли ?
-Нет вот и загляни в файл проекта dll и обычного проекта, найди отличия...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 02:32     Почему нельзя переделать dll в exe, изменив входную функцию?
Еще ссылки по теме:

Почему таким способом нельзя создать массив? - C++
Хочу создать массив вот таким способом, но выскакивает ошибка error C2057: требуется константное выражение. Ведь у меня и так константа!?...

Почему нельзя написать просто - using namespace boost; - C++
Доброго времени суток. В общем, есть программа, в которой я использую тип cpp_int. Вроде его объявление содержится в заголовочном файле...

Почему нельзя выделить статически кусок в ~100 MB? - C++
Есть код #include &lt;iostream&gt; using namespace std; enum { length = 256, count = 50 }; struct Town { char name =...

Почему нельзя компилировать отдельный заголовочный файл? - C++
Вообще можно весь код поместить в один .cpp файл. Но, как я понимаю, люди советуют все функции помещать в отдельные заголовочные файлы. А...

Почему нельзя так объявить двумерный массив? - C++
Ошибка возникает если для массива tempArray при объявлении(и одновременной инициализации) использовать переменную(size) которую принимает...

Почему нельзя объявить динамический массив глобально - C++
вот код #include &lt;iostream&gt; #include &lt;string&gt; int w = 0; string *s = new string ; using namespace std; int main { ...


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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
1693 / 880 / 44
Регистрация: 04.06.2008
Сообщений: 5,438
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, изменив входную функцию?
Ответ Создать тему
Опции темы

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