Вызвать функцию в dll
Вложений: 1
Нашел нужный инклуд файл для своей задачи, но в С знаний 0, поэтому прошу помощи. Класс в атаче, нужно сделать функцию в dll, в которой произойдет вызов функции из инклуда.
P.S Использую Code Blocks.
|
а вам так сильно нужна длл? а если функцию из инклуда переписать в сам файл с программой? тогда и длл не нужна.
|
Цель - использовать эту dll в программе написанной не на С.
|
Эм, dll я как бы еще в состоянии сделать, проблема с функцией из аттача.
|
В чём конкретно проблема?
Если я правильно понял, самый надёжный способ - экспортировать функции как stdcall, без декораций (особенность gcc). В другой среде разработки сделать import lib на основании dll. На крайняк можно загрузить dll вручную.
|
Проблема в том, что я просто незнаю как правильно вписать в функцию вызов другой. Появляется много ошибок.
Код:
#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) ===|
|
дык файлы из архива тоже надо включить в сборку (добавить в проект, проверить, не исключены ли они из сборки)
и ещё, если у тебя проект "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
|
Я еще подозреваю что, то что мне нужно написано к *nix-у, можно ли это к винде приспособить?
А думаю я так потому что:
Код:
#include <sys/param.h>
#include <sys/systm.h>
Мне главное получить рабочую функцию будь то объектник или dll, мне не важно.
|
раз у тебя дошло дело до линковки, значит с инклюдами gcc как-то разобрался
|
Цитата:
Цитата load32
Я еще подозреваю что, то что мне нужно написано к *nix-у »
|
это было очевидно). А что за функции, что делают?
|
Цитата:
Цитата pva
самый надёжный способ - экспортировать функции как stdcall, без декораций (особенность gcc). »
|
Вы хотите сказать, что в stdcall нет декорирования имен функций? 8) Есть, но у gcc оно совсем другое. Из-за этого-то и проблемы возникают.
|
Цитата:
раз у тебя дошло дело до линковки, значит с инклюдами gcc как-то разобрался
|
Я слинковал другой проект.
Цитата:
А что за функции, что делают?
|
Распаковка данных.
Вы мне скажите реально ли это завести на винде или нет? Если да, то прошу показать пример, буду очень благодарен :)
|
Цитата:
Цитата XPEHOMETP
Вы хотите сказать, что в stdcall нет декорирования имен функций? »
|
Нет, не хочу сказать, и отсуствие декораций из моей речи не следует. Здесь только инструкция к действию
это преувеличение
Цитата:
Цитата load32
Вы мне скажите реально ли это завести на винде или нет »
|
Требуется знать, какие функции не нашлись. Если ничего специфичного нет, то заведётся
|
Цитата:
Цитата load32
Вы мне скажите реально ли это завести на винде или нет? »
|
судя по гуглению, то нет.
каких данных? засекреченных?)) Поищите аналоги под венду.
|
Цитата Efir:
каких данных? засекреченных?)) Поищите аналоги под венду. »
Да, данные очень секретные :D
Ближайший аналог написан на шарпе. Из него, по моему, вообще невозможно ничего дельного сделать, в плане использования с другим яп.
.obj я таки сделал, но функция там получилась нерабочая, в отладчике access violation.
|
Цитата:
Цитата load32
.obj я таки сделал, но функция там получилась нерабочая, в отладчике access violation »
|
имеется ввиду что удалось все слинковать? "access violation в отладчике" очень растяжимое понятие.
|
Там идет обращение к сегменту данных, CMP DWORD PTR DS:[EAX],3A020000 eax=19.
|
там это в отладчике?))) Это уже внутри функции падает?
Цитата:
Цитата load32
обращение к сегменту данных »
|
про сегменты тоже смешно :)
|
Если программировать на фортране (компилятор gfortran), то это совсем не преувеличение. А серьезная проблема. Решается многими способами, в том числе и через fortran-iso-c-binding. То есть как бы у С действительно с этим проблем нет, и Фортран местами прикидывается С, чтобы достичь желаемого.
|
XPEHOMETP, Если попытаться слинковать stdcall, экспортированный gcc из msvc, то тоже не получится. Но говорю, отличия (этот пост призван обосновать слово) минимальные - подчёркивание в декорациях. Чтобы совпадало - можно хитрым способом сделать implib. Есть подробная инструкция на сайте mingw. По сути mingw прикидывается msvc... так что проблемы и в С есть.
|
Время: 20:32.
© OSzone.net 2001-