Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Использование def файла в VC.


Автор: bass 13.8.2015, 20:54
Доброго вечера уважаемые программисты.

Прошу помощи по компоновке ДЛЛ в visual studio 10.  Студию для проектов использую редко, так что прошу не пинать.
У меня есть проект на Borland 6 . И решил я в данном проекте расширить функционал. На просторах интернета нашел вполне пригодный код  на "С" под visual studio 10. В данном примере проектов штук 30-ать все исходные файлы ЕХЕ (Debug).
Зашел в свойства проекта преставил что это dll, экспортировал функции. Закинул функции и нужный функционал в данные функции...
И тут начались пляски с бубном.. Появились искаженные имена функций _AddCPP@16. В шестой студии от этого спасал def файл. Взял из рабочего проекта шестерки файл, поправил под существующую либу. Не чего не изменилось.
В настройках компоновщика нашел где крепить данный деф, но все равно не выходит каменный цветок.



Код

//======================Заголовочный файл main.h ========================================
#include <windows.h>
    int __stdcall    AddCPP     (char* ,char* ,char* ,DWORD );
    int __stdcall    RemoveCPP     (char* ,char* ,char* ,DWORD );
 

 
Код

//=========================main файл============================================ 

#include "main.h"

extern "C" __declspec(dllexport)int __stdcall    AddCPP (char* Arg1[],char* Arg2[],char* Arg3[],DWORD Arg4)
{
// тут функционал 1
return 0;
}
extern "C" __declspec(dllexport)int __stdcall    RemoveCPP     (char* Arg1[],char* Arg2[],char* Arg3[],DWORD Arg4)
{
// тут функционал 2
return 0;
}



BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}


   
Ну и сам деф. 
Пробовал
Код

LIBRARY     my

EXPORTS
 
AddCPP=AddCPP                                    @1
RemoveCPP=RemoveCPP                        @2


Пробовал
Код

LIBRARY     my.dll

EXPORTS

    
Add=AddCPP                                    @1
Remove=RemoveCPP                        @2


Но всеравно _AddCPP@16 как будто не видит дефа. Думаю из-за того что проет был ехе а я его в динамическую библиотеку переставил.

И ставлю релиз не компилирует lib и не может выполнить построение. Вернее компилирует и кидает в папку  Debug.
Перекидываю данный файл в релиз выполняет построение.

Задача вообще стоит данную длл к проекту борланда подключит статически чтобы она была в ресурсах проекта. Но это второстепенная задача.


За ранее огромное спасибо.






Автор: volatile 16.8.2015, 13:19
Цитата(bass @  13.8.2015,  20:54 Найти цитируемый пост)
Появились искаженные имена функций _AddCPP@16

Цитата(bass @  13.8.2015,  20:54 Найти цитируемый пост)
Add=AddCPP                                    @1


ну так и пишите
   Add=_AddCPP@16

и еще, после @ идет не количество аргументов, а общий размер аргументов в байтах, поэтому 1, или 2, как у вас, быть врядли может, там кратно 4

Автор: feodorv 16.8.2015, 17:36
Цитата(bass @  13.8.2015,  20:54 Найти цитируемый пост)
Появились искаженные имена функций _AddCPP@16

Это из-за __stdcall. А с Borland'ом иначе нельзя?

Автор: bass 18.8.2015, 14:42
Цитата(volatile @ 16.8.2015,  13:19)
Цитата(bass @  13.8.2015,  20:54 Найти цитируемый пост)
Появились искаженные имена функций _AddCPP@16

Цитата(bass @  13.8.2015,  20:54 Найти цитируемый пост)
Add=AddCPP                                    @1


ну так и пишите
   Add=_AddCPP@16

и еще, после @ идет не количество аргументов, а общий размер аргументов в байтах, поэтому 1, или 2, как у вас, быть врядли может, там кратно 4

volatile 

Спасибо за ответ.

ну так и пишите
   Add=_AddCPP@16

Попробую просто в 6 ой студии работала и так
   Add=_AddCPP

и еще, после @ идет не количество аргументов, а общий размер аргументов в байтах, поэтому 1, или 2, как у вас, быть врядли может, там кратно 4

Таким образом в шестерке (Visual studio 6) определяеться порядковый номер функци. (Функция может бым экспортирована по имени и по номеру.)


Это из-за __stdcall. А с Borland'ом иначе нельзя?

Да именно из-за  __stdcall.... Но это можно было def файлом исправить в Visual studio 6.

НЕ понял суть вопроса про Borland на данный момент стоит вопрос создания библиотеки с правильными именами функций. Далее я ее статически подключю к проекту борланда.

Автор: volatile 18.8.2015, 18:52
Цитата(bass @  18.8.2015,  14:42 Найти цитируемый пост)
Таким образом в шестерке (Visual studio 6) определяеться порядковый номер функци. (Функция может бым экспортирована по имени и по номеру.)

Спецификация def файла не изменилась с тех пор.

Все правильно, сорри, если после пробела и собаки, оно означает порядковый номер (ordinal).
Его вам вовсе не нужно указывать, вероятней всего.
А после собаки (без пробела) идет как я и сказал число байт в аргументе
Цитата

Компилятор также декорирует функции C, использующие соглашение о вызове __stdcall, префиксом в виде символа подчеркивания (_) и суффиксом, состоящим из символа @ и числа байтов (в десятичном формате) в списке аргументов. 

https://msdn.microsoft.com/ru-ru/library/hyx1zcd3(v=vs.120).aspx


впрочем с 10ой студией я пока не работал.

Автор: feodorv 18.8.2015, 21:05
Цитата(bass @  18.8.2015,  14:42 Найти цитируемый пост)
НЕ понял суть вопроса про Borland

Вы же не случайно перешли с __cdecl на __stdcall. Насколько я помню, это способ вызова функций в Borland'е по умолчанию. Просто стало интересно, нельзя ли борландовской функции каким-нибудь образом приписать __cdecl.

Автор: Akira 19.8.2015, 01:10
calling convention извечный камень о который спотыкаются, оставлю это http://rsdn.ru/article/devtools/bcbdll.xml

Автор: feodorv 19.8.2015, 02:05
Akira, спасибо за ссылку. В статье советуют совсем простой def-файл:
Код

LIBRARY     my
EXPORTS
  AddCPP
  RemoveCPP

bass, попробуйте, может, не нужны вообще эти сложности с @.

Автор: bass 19.8.2015, 08:17
Цитата(feodorv @ 19.8.2015,  02:05)
Akira, спасибо за ссылку. В статье советуют совсем простой def-файл:
Код

LIBRARY     my
EXPORTS
  AddCPP
  RemoveCPP

bass, попробуйте, может, не нужны вообще эти сложности с @.

Доберусь завтра до рабочего места попробую.

@1 я пытаюсь выставить порядковый номер функции.
Как то писал на 6-ке перехват сетевого трафика. Была написана ws2_32.длл . Что с английским плохо на форуме . Экспортирующая все функции стандартной библиотеки, без порядковых номеров глючила. На данном этапе библиотеку использую я, можно и  __cdecl использовать и  __stdcall. Здесь уже встал спортивный интерес на 6-ке работало. На 10 ке не могу сделать. (((( 

Спасибо за помощь.

Автор: Akira 20.8.2015, 00:27
Цитата(bass @ 19.8.2015,  08:17)
Доберусь завтра до рабочего места попробую.

Это работает.
Гонял dll в обе сторы примерно в том же году в котором была написанна статья.
Только не забудьте о конвертации coff => omf и omf => coff.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)