стандартизировать вызов и возврат из DLL для С++

Тема в разделе "WASM.BEGINNERS", создана пользователем deadly83, 2 дек 2007.

  1. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Доброго времени суток!
    Написал dll с одной йункцией которая принимает входной параметр(указатель на массив в памяти) dword и выдает выходной указатель на структуру в памяти (тоже dword) есть файлы .lib .dll
    как я должен описать функцию для VC++ и переменные для нее, ибо в СИ я дуб (разобраться в шаблоне могу а самому слепить пока что не хватает ума).
    Я так понимаю должно быть что то вроде:
    #include "stdafx.h"
    #include <iostream>
    rez* STDCALL function(a * mass);
    int * rez
    int mass[22]={14,1,13,2,10,3,0,0,0,0,14,2,5,1,7,1,3,1,5,4,5,2};
    int * a=&mass[0];
    int _tmain(int argc, _TCHAR* argv[])
    {
    return 0;
    }

    void main ()
    {
    rez = function(*a);
    }
    Спасибо за ответ.
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    Код (Text):
    1. int* function(int*);
    на чем написана dll и как объявлена функция в ней?
     
  3. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    dll написана целиком на асме функия в ней объявлена как
    .code
    DllEntry proc hInstance:HINSTANCE, reason:lol: WORD, reserved1:lol: WORD
    mov eax,TRUE

    ret
    DllEntry Endp
    function proc param1:lol: WORD
    или не это ты спросил?
     
  4. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    я так понял int* function(int*); это ее вызывать так в теле void main() ? а описать?
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    ну, значит так и объявляй:

    Код (Text):
    1. int* _stdcall function(int*);
    2.  
    3. int * rez = NULL;
    4. int mass[22]={14,1,13,2,10,3,0,0,0,0,14,2,5,1,7,1,3,1,5,4,5,2};
    5.  
    6. int main()
    7. {
    8.     rez = function(mass);
    9.     return 0;
    10. }
     
  6. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    error LNK2019: unresolved external symbol "int * __stdcall function(int *)" (?function@@YGPAHPAH@Z) referenced in function _main
    D:\mydocs\projects\vs2005\Projects\class_player\Debug\class_player.exe : fatal error LNK1120: 1 unresolved externals
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    lib-файл подключил к проекту? функция в dll объявлена как экспортируемая?
     
  8. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    в файле .def описано так:
    LIBRARY func
    EXPORTS function
    я в разделе exports может должен дописать этот параметр который я передаю?
     
  9. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    либ подключил , а как длл объявить экспортируемой?)
     
  10. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    меню project,properties,configuration,linker,input,aditional...
    там добавил либ
     
  11. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    попробуй так:
    Код (Text):
    1. extern "C" int* _stdcall function(int*);
     
  12. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    да вернула адрес спс прокатило, тока там почему то нуль, а должны быть 3 значения размером dword :dntknw:
     
  13. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    моя процедура возвращает в eax адрес на структуру из 3 чисел размерами dword
     
  14. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    смотри код в длл. ошибка, видимо, там.
     
  15. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    хорошу поставлю вопрос иначе чтоб СИ понял адрес структуры который возвращает процедура куда я его должен запихнуть в dll ? разве не в еах указать на него?
     
  16. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    покажи код функции из dll
     
  17. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    все ребята спасибо за ответы, вопрос исчерпан greath thx to RMN personal ^^ (можем и в доту порулить как нить если играешь на европе)
    то просто друг сделал массив не байт а двойных слов вот и возвращался нуль
     
  18. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    теперь у него проблема как записать в переменную int адрес первого элемента массива chat :lol:
     
  19. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    ведь char и int разные типы и такая конструкция как int * a=&mass[0]; где mass это массив char не катит
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    deadly83
    :) Извините, но вроде у Вас каша в голове. int * a - это не переменная int, а указатель на int. Точно так же можно было бы написать char *b=&mass[0], и разницы между переменными a и b нету: размер указателя всегда - 4 байта (надеюсь, никто не ткнет носом в 64-битный режим). Другое дело, что си различает указатели на разные типы данных в связи со спецификой действий над указателями, поэтому можно сделать и переопределение типа:
    int * a=(int *)&mass[0], что в данном случае довольно глупо. Не понимаю необходимости в том, чтобы запихнуть указатель в int, но если очень хочется, то можно сделать и так:
    int a=(int)&mass[0]
    И еще... & - операция взятия адреса, а [] - разыменование. Не вижу смысла в том, чтобы делать и то, и то. Это все равно, что написать i = j+1-1. Поэтому int a=(int)&mass[0] стоит, наверное, писать как int a=(int)mass.