Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » экспорт dll

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Программа ничего не выводит на экран, а должна запросить пароль (C++).

Код:
#include<stdio.h>
#include<Windows.h>
#include<Shlwapi.h>
 
__declspec(dllexport)int demo()
{
    const char PSW[]="myGOODuserpassword\n";
    const int PSW_SIZE=100;
    int count=0;
    char buff[PSW_SIZE]="";
    for(;;)
    {
        printf("Enter password: ");
        fgets(&buff[0],PSW_SIZE-1,stdin);
        if(strcmp(&buff[0],PSW))printf("Wrong password\n");
        else break;
        if(++count>2)return -1;
    }
    printf("Password OK\n");
}
 
int main()
{
    HMODULE hMod;
    int (*zzz)();
    hMod=LoadLibrary("crackme0x03");
    zzz=(int(*)())GetProcAddress(hMod,"demo");
    if(hMod&&zzz)
        zzz();
    return 0;
}

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 21:33 30-07-2015
opencl26

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
феликс, такие примеры разбираются сам на сам с компом, осью и компилятором, тогда есть результат в виде нейронов, хранящих инфу о синтаксисе, а иначе стэковерфлоу ляжет от таких пограммистов, хотя может вы хотите открыть новый трэнд в вэбе: поток сознания в массы, тогда скатертью дорога, но лично мне это не интересно  :-\ вы клиент - ne_viens




Прекращайте нести чушь, иначе придется с вами распрощаться.

Всего записей: 319 | Зарегистр. 17-09-2014 | Отправлено: 21:42 30-07-2015 | Исправлено: opencl26, 21:43 30-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Отбой, разобрался. Уже было.
Цитата:
а иначе стэковерфлоу ляжет
от хамства opencl26. Глупых вопросов не бывает, бывают глупые ответы. Кто-то из знаменитых сказал.
 
 
 

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 22:46 30-07-2015
opencl26

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
извините

Всего записей: 319 | Зарегистр. 17-09-2014 | Отправлено: 23:17 30-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
извините
принято.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 10:01 31-07-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
opencl26
Вместо
Код:
hMod=LoadLibrary("crackme0x03");  

можно использовать
Код:
hMod = GetModuleHandle(NULL);

 
А что касается
Код:
zzz = (int(*)())GetProcAddress(hMod, "demo");

то здесь тебе нужно посмотреть, с каким именем твоя функция "demo" экспортируется, в моём случае это
Код:
zzz = (int(*)())GetProcAddress(hMod, "?demo@@YAHXZ");

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 13:06 31-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
idiMAN, в visual studio 2010  работать не будет. Решение здесь: http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=14278#1

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 13:39 31-07-2015
opencl26

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нести ничего не стоит так сложно  
особенно если нести далеко
и смысл в том, что нести что-то можно
до тех пор пока не сбежит молоко

Код:
 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int demo()
{
    const char PSW[]="myGOODuserpassword\n";
    const int PSW_SIZE=100;
    int count=0;
    char buff[PSW_SIZE]="";
    for(;;)
    {
        printf("Enter password: ");
        fgets(&buff[0],PSW_SIZE-1,stdin);
        if(strcmp(&buff[0],PSW))printf("Wrong password\n");
        else break;
        if(++count>2)return -1;
    }
    printf("Password OK\n");
}
 
int main()
{
    demo();
    return 0;
}
 

вот этот код под mingw работает отлично, остальные баги - проблемы архитектуры windows, которая к c++ имеет весьма отдалённое отношение

Всего записей: 319 | Зарегистр. 17-09-2014 | Отправлено: 13:59 31-07-2015 | Исправлено: opencl26, 14:00 31-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Задача состояла в том, чтобы вызвать функцию из другого exe-файла. Для данного примера подходит имя текущего файла. Так, что
Цитата:
Решение здесь: http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=14278#1
. Ваш код, opencl26 тоже правильный, но не подходит для поставленной задачи.
 

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 16:49 31-07-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StillPhelix
Я вообще понял так, что нужно вызвать экспортируемую функцию из того же самого exe-файла, где она и описана (не спрашивайте меня, зачем...), отсюда и упрощение в виде
Код:
hMod = GetModuleHandle(NULL);  

 
Если же цель просто вызвать функцию "demo", то opencl26 сам себе ответил постом выше.

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 18:06 31-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
idiMAN, С
Цитата:
hMod = GetModuleHandle(NULL);

Цитата:
в visual studio 2010  работать не будет. Решение здесь: http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=14278#1

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

Цитата:
Если же цель просто вызвать функцию "demo", то opencl26 сам себе ответил постом выше.
. Я знаю что так проще и правильней в общем случае. Или написать DLL.
Вобщем решение найдено, ссылку я дал. Тему можно закрыть.
 
 
 

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 18:46 31-07-2015
idiMAN

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
StillPhelix
Только что проверил, данный код отлично работает и в VS2010 и в VS2013

Код:
 
#include "stdafx.h"
#include<stdio.h>  
#include<Windows.h>  
#include<Shlwapi.h>  
 
extern "C"
{
    __declspec(dllexport)int demo();
}
 
__declspec(dllexport)int demo()
{
    const char PSW[] = "myGOODuserpassword\n";
    const int PSW_SIZE = 100;
    int count = 0;
    char buff[PSW_SIZE] = "";
    for (;;)
    {
        printf("Enter password: ");
        fgets(&buff[0], PSW_SIZE - 1, stdin);
        if (strcmp(&buff[0], PSW))printf("Wrong password\n");
        else break;
        if (++count>2)return -1;
    }
    printf("Password OK\n");
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hMod;
    int(*zzz)();
    hMod = GetModuleHandle(NULL);
    zzz = (int(*)())GetProcAddress(hMod, "demo");
    if (hMod&&zzz)
        zzz();
    return 0;
}
 

Всего записей: 466 | Зарегистр. 05-05-2003 | Отправлено: 19:28 31-07-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
idiMAN, всё компилируется и работает нормально, только в памяти один модуль программы, а нужно 2 (из второго вызывается функция). Я добился нужного эффекта, но в синтаксисе С. Ссылку уже давал.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 21:05 31-07-2015
opencl26

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
в синтаксисе С.

это не c, в стандарте c нету
Код:
__declspec(dllexport)
это диалект c от майкрософта  
по крайней мере в последнем драфте
полный стандарт денег немалых стоит

Всего записей: 319 | Зарегистр. 17-09-2014 | Отправлено: 03:28 01-08-2015 | Исправлено: opencl26, 03:29 01-08-2015
StillPhelix



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
это диалект c от майкрософта  
по крайней мере в последнем драфте
полный стандарт денег немалых стоит

 
С Майкрософт жить по майкрософтски выть.

Всего записей: 173 | Зарегистр. 18-08-2013 | Отправлено: 16:11 01-08-2015
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » экспорт dll


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru