Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование def файла в VC. Не работает подключенный def. 
:(
    Опции темы
bass
Дата 13.8.2015, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



Доброго вечера уважаемые программисты.

Прошу помощи по компоновке ДЛЛ в 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.
Перекидываю данный файл в релиз выполняет построение.

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


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






PM MAIL   Вверх
volatile
Дата 16.8.2015, 13:19 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 4
Всего: 85



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

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


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

и еще, после @ идет не количество аргументов, а общий размер аргументов в байтах, поэтому 1, или 2, как у вас, быть врядли может, там кратно 4
PM MAIL   Вверх
feodorv
Дата 16.8.2015, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



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

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bass
Дата 18.8.2015, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



Цитата(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 на данный момент стоит вопрос создания библиотеки с правильными именами функций. Далее я ее статически подключю к проекту борланда.

PM MAIL   Вверх
volatile
Дата 18.8.2015, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 4
Всего: 85



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

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

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

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

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


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


Это сообщение отредактировал(а) volatile - 18.8.2015, 19:17
PM MAIL   Вверх
feodorv
Дата 18.8.2015, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



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

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Akira
Дата 19.8.2015, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 26.3.2012

Репутация: нет
Всего: нет



calling convention извечный камень о который спотыкаются, оставлю это здесь
PM MAIL   Вверх
feodorv
Дата 19.8.2015, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 1
Всего: 45



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

LIBRARY     my
EXPORTS
  AddCPP
  RemoveCPP

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
bass
Дата 19.8.2015, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 5.8.2007

Репутация: нет
Всего: 2



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

LIBRARY     my
EXPORTS
  AddCPP
  RemoveCPP

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

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

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

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

Это сообщение отредактировал(а) bass - 19.8.2015, 08:18
PM MAIL   Вверх
Akira
Дата 20.8.2015, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 26.3.2012

Репутация: нет
Всего: нет



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

Это работает.
Гонял dll в обе сторы примерно в том же году в котором была написанна статья.
Только не забудьте о конвертации coff => omf и omf => coff.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0771 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.