Написание dll для Колибри на языках высокого уровня.

Everything you can't fit into other forums
  • Попробуй добавить в MSVC 6.0 /FORCE:UNRESOLVED - при сборке все(почти все) ошибки будут игнарироваться.
  • Вот это исходный код dll на C.

    Code: Select all

    /*
         test 
    
    */
    
    #define DllExport extern "C" __declspec(dllexport) 
    
    DllExport int __stdcall summa(int a,int b) 
    { 
       int sum;
    
       sum=a+b;
       return(sum);
    } 
    
    При установке флага /FORCE:UNRESOLVED MSVC выдаёт следующее :

    Code: Select all

    --------------------Configuration: test - Win32 Debug--------------------
    Compiling...
    main.cpp
    Linking...
    LINK : warning LNK4075: ignoring /INCREMENTAL due to /FORCE specification
       Creating library Debug/test.lib and object Debug/test.exp
    LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12
    Debug/test.dll : warning LNK4088: image being generated due to /FORCE option; image may not run
    
    test.dll - 1 error(s), 2 warning(s)
    
    Нисмотря на ошибки dll создаётся.Только в Колибри она не грузиться(наверное неправильно оформлена dll).
    Что такое "__DllMainCRTStartup@12" и как от него избавиться - я незнаю.
  • andrew_programmer

    Колибри не умеет грузить PE DLL. Чтобы сделать DLL на С надо
    скомпилировать все файлы в один obj-файл и сделать таблицу экспорта

    Code: Select all

    typedef struct
    { char *name;
      void *addr;
    } EXP;
    
    int __stdcall START(int state);
    int my_func(int a, int b);
    
    EXP EXPORTS[]={ {"START", START},
                    {"version", (void *)0x00010001},  
                    {"MyFunc", my_func},
                    0,0
                  };   
    
    int __stdcall START(int state)
    {
      return 1;
    }
    
    int my_func(int a, int b)
    {
      return a+b;
    }
    
    MSVC добавляет знак подчёркивания ко всем именам, способ отменить это
    я не нашёл, __pascal в VС8 не поддерживается. Остаётся сгенерировать asm,
    подредактировать

    Code: Select all

            .686P
            .XMM
            .model  flat
    
    PUBLIC  EXPORTS
    _DATA   SEGMENT
    
    $SG579  DB      'START', 00H
    $SG580  DB      'version', 00H
    $SG582  DB      'MyFunc', 00H
    
    EXPORTS DD      FLAT:$SG579
            DD      FLAT:_START@4
            DD      FLAT:$SG580
            DD      010001H
            DD      FLAT:$SG582
            DD      FLAT:_my_func
            DD      00H
            DD      00H
    
    и скомпилировать ml /Cp имя_файла.
  • Serge

    А как сделать, чтобы MSVC генерировал ассемблерный листинг ?

    >и скомпилировать ml /Cp имя_файла.

    Что такое "ml/Cp" ? Как этим пользоваться ?

    И ещё один вопрос. Как сделать, чтобы все obj файлы объединились в один - главный obj файл ?
  • Если компилируешь из среды то посмотри в настройках проекта опцию
    С/С++ -> Output Files -> Assembler Output
    или задай ключ /FA для командной строки.
    Чтобы получить один файл надо или собрать все исходники в один файл или включить все ссылки в один главный файл при помощи #include так же как и в FASM.

    ml это MS ассемблер. Обычно находится в одном каталоге с cl.exe link.exe и т.д. /Cp - необязательный ключ указывает ассемблеру сохранять регистр в именах переменных. Дополнительные ключи показываются командой ml /? Для компиляции обычно хватает ml my_prog.asm

    Компилятор создаёт в выходном файле дополнительные секции поэтому лучше компилировать через ассемблер.
  • Serge

    Спасибо за советы.
    У меня ml почему-то не оказалось. Но я отредактировал ассемблерный код так, чтобы он компилировался FASM-ом. И все заработало !
  • Who is online

    Users browsing this forum: No registered users and 14 guests