Передача указателя из Си++ в Dll на Delphi

Тема в разделе "MS Visual C++", создана пользователем vladimirFF, 22 фев 2010.

  1. vladimirFF

    vladimirFF Гость

    Доброго всем времени суток!

    При передаче указателя на блок памяти из кода на Си++ в длл-функцию, написанную на дельфи, обнаруживаю в этом блоке памяти совсем другие данные.

    Есть библиотека DLL, написанная на delphi. В ней функция вида:
    function sendData(<тут разные параметры>; data: Pointer): BYTE; stdcall;
    begin
    with TFileStream.Create('dump.dat',fmOpe nWrite) do try
    write(data,wSize);
    finally
    free();
    end;
    end;

    ее объявление в Си:
    typedef BYTE (WINAPI *SendData)(BYTE, WORD, BYTE, void*);


    и код в си:
    void* data;
    data = malloc(size);
    //дальше в память, куда указывает data записываются данные
    memcpy(data,&val,sz);
    //и собственно вызов функции DLL
    sendData(catId,size,objCount,data);


    Проблема в следующем: то что я записываю в data в Си и то что я получаю в DLL-фнкции - совершенно разные данные. Ошибки доступа к памяти при этом не возникает.

    Подскажите в чем может быть причина?
     
  2. Odin_KG

    Odin_KG Гость

    Логично предположить, что аргументы в функцию передаются по другим правилам. А другие функции из этой же DLL нормально работают?
     
  3. vladimirFF

    vladimirFF Гость

    спасибо, что откликнулись.
    да другие функции работают без проблем - в частности аналогичная функция, которая действует наоборот:
    память выделяется и заполняется в delphi, и передается в Си указателем - все ок.
    А вот из Си в delphi - никак, получаю работающий кусок памяти, заполненный всяким мусором и нулями.
    Размер куска пробовал от 10 байт до 800.
     
  4. Odin_KG

    Odin_KG Гость

    Ну, может быть в данном случае возврат идет через return.

    Ответ какой-то неоднозначный получился :) Я спрашивал, работают ли у вас остальные функции при вызове из C? То, что они из Delphi работают это и так понятно.

    Вообще такая конструкция по объявлению функции на C мне кажется чересчур мудреной:
    typedef BYTE (WINAPI *SendData)(BYTE, WORD, BYTE, void*);
    может по-проще написать?

    Чтобы библиотеку подключать к C++ обычно используют h-файл и lib-файл, которые прилагаются к DLL. Если у вас их нет, то, честно говоря, мне не ясно как вы вообще библиотеку подключаете. Тогда вроде как загружать библиотеку надо через LoadLibrary и потом руками вынимать из неё функции.

    пожалуйста
     
  5. vladimirFF

    vladimirFF Гость

    Они работают из Си. просто данные формируются в dll (которая на дельфи), а используются в Си - это я имел ввиду

    а как проще?


    к библиотеке ничего не прилагается, потому что я ее сам же и написал :)
    Подключаю именно динамически через LoadLibrary
     
  6. Odin_KG

    Odin_KG Гость

    Можно так попробовать:
    BYTE* WINAPI SendData(BYTE, WORD, BYTE, void*);

    Функции все лучше перечислить в отдельном h-файле. В начале файла можно попробовать поставить:
    #ifdef __cplusplus
    extern "C" {
    #endif

    тут перечисляем функции
    ...
    ...
    ...

    а в конце:
    #ifdef __cplusplus
    }
    #endif


    Ну, это похвально :) Я к сожалению в Delphi не очень разбираюсь. На C только могу сделать.
     
Загрузка...

Поделиться этой страницей