Переписываю C приложение в dll библиотеку
От: Kadet89  
Дата: 08.06.13 13:18
Оценка: -1 :)
Имеется исходник консольной программы для проведения вычислений. Программа написана на Си и компилируется mingw. После компиляции я получаю рабочий экзешник. Мне эту программу нужно переделать в dll, так, чтобы в дальнейшем я мог подключать эту dll к программе-графическому интерфейсу.

Для начала я добавил под функцию мэйн в программе (будующий dll) такой код:
__declspec(dllexport) int __cdecl Message()  {
    MessageBox(NULL, TEXT("1"), TEXT("1"), MB_OK);
    return 1;
}

Собрав программу я получил экзешник (не dll) и проверив его в dumpbin я получил такой результат:

ordinal hint RVA name

1 0 00011AA0 Message

Для проверки я набросал простое приложение на с++


typedef int (_cdecl*pproc)();
pproc out;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    HINSTANCE hLib = LoadLibrary(L"messager.dll");
    if(hLib == NULL) return 0;

    out = (pproc)GetProcAddress(hLib,"Message");
    printf("out %i", (out == NULL)); //0

    if (out == NULL) {
        printf("Error getting Address");
    }
    else {
        int j = out(); // Error Access violation
    }
    FreeLibrary(hLib);
    return 0;
}

"Библиотека" загружается и функция Message тоже. Но при попытке вызвать функцию я получаю ошибку:
0xC0000005: Нарушение прав доступа при чтении "0x0045a780"
0xC0000005: Access violation reading location "0x0045a780

Собственно я почти уверен что мало просто добавить __declspec(dllexport) в исходник чтоб получить рабочую dll. Я пробовал искать мануалы и доки, но всё что находилось — было под С++. Я зашел в тупик и решил поднять тему тут, буду благодарен за любую помощь.
библиотека dll access violation
Re: Переписываю C приложение в dll библиотеку
От: uzhas Ниоткуда  
Дата: 09.06.13 12:39
Оценка:
Здравствуйте, Kadet89, Вы писали:

K>Собрав программу я получил экзешник (не dll) и проверив его в dumpbin я получил такой результат:

так вам надо сделать длл, а не exe, работайте в этом направлении
вы что же потом переименовали полученный exe в dll? плохая затея
Re: Переписываю C приложение в dll библиотеку
От: Erop Россия  
Дата: 09.06.13 14:40
Оценка:
Здравствуйте, Kadet89, Вы писали:

K>Собственно я почти уверен что мало просто добавить __declspec(dllexport) в исходник чтоб получить рабочую dll. Я пробовал искать мануалы и доки, но всё что находилось — было под С++. Я зашел в тупик и решил поднять тему тут, буду благодарен за любую помощь.


1) у тебя неправильно инициализируется рантайм, скажи ЛИНКЕРУ, что ты собираешь DLL, а не EXE. С или С++ в данном случае не так важно.

2) Если ты укажешь чем конкретно ты планируешь собирать свою dll и exe, которая ту dll будет линковать -- будет проще дать тебе конкретные рекоммендации.

3) Зачем тебе вообще dll? Обычно C довольно таки переносим. Почему бы просто не вытащить весь код в основную программу и всё?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Переписываю C приложение в dll библиотеку
От: Ops Россия  
Дата: 09.06.13 19:14
Оценка:
Здравствуйте, Erop, Вы писали:

E>3) Зачем тебе вообще dll? Обычно C довольно таки переносим. Почему бы просто не вытащить весь код в основную программу и всё?


А зачем вообще декомпозиция?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[3]: Переписываю C приложение в dll библиотеку
От: Erop Россия  
Дата: 09.06.13 20:40
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>А зачем вообще декомпозиция?


Кому зачем. Тебе надо dll, что бы был плагин? Или для чего?
Для чего ей быть чисто с-шной?
На чём остальная программа?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.