Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Вызвать функцию в dll (http://forum.oszone.net/showthread.php?t=268133)

load32 15-09-2013 18:25 2218353

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

Pavluha 15-09-2013 19:39 2218390

а вам так сильно нужна длл? а если функцию из инклуда переписать в сам файл с программой? тогда и длл не нужна.

load32 15-09-2013 19:50 2218398

Цель - использовать эту dll в программе написанной не на С.

Pavluha 15-09-2013 20:01 2218402

load32, покопавшись в нете, нашёл на мой взгляд, решение:

http://stackoverflow.com/questions/1...-in-codeblocks

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

load32 15-09-2013 20:40 2218418

Эм, dll я как бы еще в состоянии сделать, проблема с функцией из аттача.

pva 15-09-2013 21:42 2218456

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

load32 15-09-2013 22:05 2218470

Проблема в том, что я просто незнаю как правильно вписать в функцию вызов другой. Появляется много ошибок.
Код:

#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 2218501

дык файлы из архива тоже надо включить в сборку (добавить в проект, проверить, не исключены ли они из сборки)
и ещё, если у тебя проект "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 2218909

Я еще подозреваю что, то что мне нужно написано к *nix-у, можно ли это к винде приспособить?
А думаю я так потому что:
Код:

#include <sys/param.h>
#include <sys/systm.h>

Мне главное получить рабочую функцию будь то объектник или dll, мне не важно.

pva 17-09-2013 09:10 2219167

раз у тебя дошло дело до линковки, значит с инклюдами gcc как-то разобрался

Efir 17-09-2013 11:57 2219234

Цитата:

Цитата load32
Я еще подозреваю что, то что мне нужно написано к *nix-у »

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

XPEHOMETP 17-09-2013 13:08 2219281

Цитата:

Цитата pva
самый надёжный способ - экспортировать функции как stdcall, без декораций (особенность gcc). »

Вы хотите сказать, что в stdcall нет декорирования имен функций? 8) Есть, но у gcc оно совсем другое. Из-за этого-то и проблемы возникают.

load32 17-09-2013 14:33 2219335

Цитата:

раз у тебя дошло дело до линковки, значит с инклюдами gcc как-то разобрался
Я слинковал другой проект.
Цитата:

А что за функции, что делают?
Распаковка данных.

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

pva 17-09-2013 14:51 2219350

Цитата:

Цитата XPEHOMETP
Вы хотите сказать, что в stdcall нет декорирования имен функций? »

Нет, не хочу сказать, и отсуствие декораций из моей речи не следует. Здесь только инструкция к действию
Цитата:

Цитата XPEHOMETP
совсем другое »

это преувеличение
Цитата:

Цитата load32
Вы мне скажите реально ли это завести на винде или нет »

Требуется знать, какие функции не нашлись. Если ничего специфичного нет, то заведётся

Efir 17-09-2013 18:29 2219467

Цитата:

Цитата load32
Вы мне скажите реально ли это завести на винде или нет? »

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

Цитата:

Цитата load32
Распаковка данных. »

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

load32 17-09-2013 19:10 2219496

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

Efir 17-09-2013 22:04 2219558

Цитата:

Цитата load32
.obj я таки сделал, но функция там получилась нерабочая, в отладчике access violation »

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

load32 17-09-2013 22:13 2219560

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

Efir 17-09-2013 22:44 2219581

Цитата:

Цитата load32
Там »

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

Цитата:

Цитата load32
обращение к сегменту данных »

про сегменты тоже смешно :)

load32 18-09-2013 09:02 2219695

Да, внутри функции.

XPEHOMETP 18-09-2013 10:10 2219713

Цитата:

Цитата pva
это преувеличение »

Если программировать на фортране (компилятор gfortran), то это совсем не преувеличение. А серьезная проблема. Решается многими способами, в том числе и через fortran-iso-c-binding. То есть как бы у С действительно с этим проблем нет, и Фортран местами прикидывается С, чтобы достичь желаемого.

pva 18-09-2013 13:08 2219789


XPEHOMETP, Если попытаться слинковать stdcall, экспортированный gcc из msvc, то тоже не получится. Но говорю, отличия (этот пост призван обосновать слово) минимальные - подчёркивание в декорациях. Чтобы совпадало - можно хитрым способом сделать implib. Есть подробная инструкция на сайте mingw. По сути mingw прикидывается msvc... так что проблемы и в С есть.


Время: 20:32.

Время: 20:32.
© OSzone.net 2001-