Войти

Показать полную графическую версию : Вызвать функцию в dll


Страниц : [1] 2

load32
15-09-2013, 18:25
Нашел нужный инклуд файл для своей задачи, но в С знаний 0, поэтому прошу помощи. Класс в атаче, нужно сделать функцию в dll, в которой произойдет вызов функции из инклуда.
P.S Использую Code Blocks.

Pavluha
15-09-2013, 19:39
а вам так сильно нужна длл? а если функцию из инклуда переписать в сам файл с программой? тогда и длл не нужна.

load32
15-09-2013, 19:50
Цель - использовать эту dll в программе написанной не на С.

Pavluha
15-09-2013, 20:01
load32, покопавшись в нете, нашёл на мой взгляд, решение:

http://stackoverflow.com/questions/16668552/c-dll-in-codeblocks

по-русски:файл - новый - проект - консольной приложение - dll

load32
15-09-2013, 20:40
Эм, dll я как бы еще в состоянии сделать, проблема с функцией из аттача.

pva
15-09-2013, 21:42
В чём конкретно проблема?
Если я правильно понял, самый надёжный способ - экспортировать функции как stdcall, без декораций (особенность gcc). В другой среде разработки сделать import lib на основании dll. На крайняк можно загрузить dll вручную.

load32
15-09-2013, 22:05
Проблема в том, что я просто незнаю как правильно вписать в функцию вызов другой. Появляется много ошибок.
#include "main.h"
#include "mppc.h"

// a sample exported function
int DLL_EXPORT SomeFunction(u_char **src, u_char **dst, u_long *srcCnt, u_long *dstCnt, char *history, int flags)
{
return MPPC_Decompress(src, dst, srcCnt, dstCnt, history, flags);
}

extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
// attach to process
// return FALSE to fail DLL load
break;

case DLL_PROCESS_DETACH:
// detach from process
break;

case DLL_THREAD_ATTACH:
// attach to thread
break;

case DLL_THREAD_DETACH:
// detach from thread
break;
}
return TRUE; // succesful
}
obj\Debug\main.o||In function `Z12SomeFunctionPPhS0_PmS1_Pci':|
undefined reference to `MPPC_Decompress(unsigned char**, unsigned char**, unsigned long*, unsigned long*, char*, int)'|
||=== Build finished: 1 errors, 0 warnings (0 minutes, 4 seconds) ===|

pva
15-09-2013, 22:59
дык файлы из архива тоже надо включить в сборку (добавить в проект, проверить, не исключены ли они из сборки)
и ещё, если у тебя проект "C++", а не "C" сделай так вокруг include "mppc.h":

extern "C" {
#include "mppc.h"
}


Ещё варианты:
1. переименуй *.c в *.cpp
2. не переименовывай, но сделай проект C, а не C++
объяснение ошибок линка кроется в различиях C и C++; здесь хорошо разъясняется: http://www.gamedev.ru/code/forum/?id=56367

load32
16-09-2013, 18:35
Я еще подозреваю что, то что мне нужно написано к *nix-у, можно ли это к винде приспособить?
А думаю я так потому что:
#include <sys/param.h>
#include <sys/systm.h>
Мне главное получить рабочую функцию будь то объектник или dll, мне не важно.

pva
17-09-2013, 09:10
раз у тебя дошло дело до линковки, значит с инклюдами gcc как-то разобрался

Efir
17-09-2013, 11:57
Я еще подозреваю что, то что мне нужно написано к *nix-у »

это было очевидно). А что за функции, что делают?

XPEHOMETP
17-09-2013, 13:08
самый надёжный способ - экспортировать функции как stdcall, без декораций (особенность gcc). »
Вы хотите сказать, что в stdcall нет декорирования имен функций? 8) Есть, но у gcc оно совсем другое. Из-за этого-то и проблемы возникают.

load32
17-09-2013, 14:33
раз у тебя дошло дело до линковки, значит с инклюдами gcc как-то разобрался
Я слинковал другой проект.
А что за функции, что делают?
Распаковка данных.

Вы мне скажите реально ли это завести на винде или нет? Если да, то прошу показать пример, буду очень благодарен :)

pva
17-09-2013, 14:51
Вы хотите сказать, что в stdcall нет декорирования имен функций? »
Нет, не хочу сказать, и отсуствие декораций из моей речи не следует. Здесь только инструкция к действию
совсем другое »
это преувеличение
Вы мне скажите реально ли это завести на винде или нет »
Требуется знать, какие функции не нашлись. Если ничего специфичного нет, то заведётся

Efir
17-09-2013, 18:29
Вы мне скажите реально ли это завести на винде или нет? »

судя по гуглению, то нет.

Распаковка данных. »

каких данных? засекреченных?)) Поищите аналоги под венду.

load32
17-09-2013, 19:10
Цитата Efir:
каких данных? засекреченных?)) Поищите аналоги под венду. »
Да, данные очень секретные :D
Ближайший аналог написан на шарпе. Из него, по моему, вообще невозможно ничего дельного сделать, в плане использования с другим яп.
.obj я таки сделал, но функция там получилась нерабочая, в отладчике access violation.

Efir
17-09-2013, 22:04
.obj я таки сделал, но функция там получилась нерабочая, в отладчике access violation »

имеется ввиду что удалось все слинковать? "access violation в отладчике" очень растяжимое понятие.

load32
17-09-2013, 22:13
Там идет обращение к сегменту данных, CMP DWORD PTR DS:[EAX],3A020000 eax=19.

Efir
17-09-2013, 22:44
Там »

там это в отладчике?))) Это уже внутри функции падает?

обращение к сегменту данных »
про сегменты тоже смешно :)

load32
18-09-2013, 09:02
Да, внутри функции.




© OSzone.net 2001-2012