Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2009, 12:54   #11
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
А в Делфи с этим все в порядке, разработчики позаботились за имена функций.
А в Дельфи вообще можно экспортировать перегруженные функции? Например такой код:
Код:
function A(x : integer) : integer; overload;
begin
   A := x;
end;

function A(x : integer; y : integer) : integer; overload;
begin
   A := x + y;
end;

exports A(x : integer) name 'A';
exports A(x : integer; y : integer) name 'A';
прокатывает, НО линковщик создает разные функции в асме - A и A_0. Спрашивается - как их вызывать?
BaronTreep вне форума Ответить с цитированием
Старый 14.07.2009, 13:16   #12
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Оч просто:
ДЛЛ
Код:
library Project1;

uses
  SysUtils,
  Classes;

{$R *.res}
  function A(x : integer) : integer; overload;
begin
   A := x;
end;

function A(x : integer; y : integer) : integer; overload;
begin
   A := x + y;
end;

  exports а(x : integer),A(x : integer; y : integer);
begin
end.
Проект:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
    function A(x : integer) : integer; overload; external 'Project1.dll';
    function A(x : integer; y : integer) : integer; overload; external 'Project1.dll';
var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 caption:=inttostr(a(10)+a(10,3));
end;

end.
Между прочим это выльется в вот такой казус, (см. в приложении)
Изображения
Тип файла: jpg Безымянный.JPG (67.3 Кб, 42 просмотров)
I'm learning to live...

Последний раз редактировалось Stilet; 14.07.2009 в 13:20.
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 13:19   #13
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Если я не ошибаюсь (хотя могу ошибиться) в Borland C++ проблема с импортированием перегруженных функций.
profi вне форума Ответить с цитированием
Старый 14.07.2009, 13:24   #14
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Ну и я о том дже - в Дельфи тоже имена искажаются при перегрузке. Но в отличии от Си, который в этом смысле ближе к ассамблеру, это не отражается на программировании, т.е. не нужно заботится об обвёртках, или о том как линковщик пишет функции.

Тем не менее если вызывать эти функции из другого языка (из Си того же) то могут возникнуть неудобства (почему "они" говорят, что на Дельфи мол нельзя писать dll). В статье, по ссылке выше, как раз об этом говорилось.

Про code_export_A IDA говорит иначе. Может отладчик Дельфи специально прикидывается))

Последний раз редактировалось BaronTreep; 14.07.2009 в 13:29.
BaronTreep вне форума Ответить с цитированием
Старый 14.07.2009, 13:32   #15
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

ууух.. как тут много уже написали...

Цитата:
Сообщение от profi Посмотреть сообщение
extern "C" ____stdcall __declspec(dllexport ) int MyFunc(); -вот так все должно работать.
вот так как раз таки и не хочет работать : пишет "missing function header (old-style formal list?)"

спасибо всем за полезную информацию

рабочий вариант такой

Код:
#ifndef BUILD_APP
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif

extern "C" DLL_EXPORT int MyFunc();
вызов

Код:
_pF=(pFunc)::GetProcAddress(hMod,"MyFunc");
counter вне форума Ответить с цитированием
Старый 14.07.2009, 13:48   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в Дельфи тоже имена искажаются при перегрузке.
Посмотри на мой скрин. Где там искажения? Или Олли показывает неверно по твоему?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 13:50   #17
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Код:
extern "C" __declspec(dllexport ) int MyFunc(...);
это правильный способ завернуть C++ код в С-обвертку, я думаю.

Хотелось бы вернуться к Дельфям, потому что:

Цитата:
Если я не ошибаюсь (хотя могу ошибиться) в Borland C++ проблема с импортированием перегруженных функций.
А в примере выше caption:=inttostr(a(10)+a(10,3)); (по идее 23) дает 36. Что-то не так!

Если верить дебагеру Дельфи:
Код:
exports A(x : integer) name 'A';
exports A(x : integer; y : integer) name 'A';;

function A(x : integer) : integer; overload; external 'Project1.dll' name 'A';
function A(x : integer; y : integer) : integer; overload; external 'Project1.dll' name 'A';
Неправильно работает.

Если верить IDA:
Код:
exports A(x : integer) name 'A';
exports A(x : integer; y : integer) name 'A';

function A(x : integer) : integer; overload; external 'Project1.dll' name 'A';
function A(x : integer; y : integer) : integer; overload; external 'Project1.dll' name 'A_0';
Тоже.

Единственное что остается - ВРУчную замангалить имена (исказить), т.е. взять на себя роль линковщика (как в СИ, где вышеприведенный код работает правильно). Короче так:

Код:
exports A(x : integer) name 'A';
exports A(x : integer; y : integer) name 'A_';

function A(x : integer) : integer; overload; external 'Project1.dll' name 'A';
function A(x : integer; y : integer) : integer; overload; external 'Project1.dll' name 'A_';
BaronTreep вне форума Ответить с цитированием
Старый 14.07.2009, 13:53   #18
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Так что IDA врет? Чем тогда объяснить неверный ответ в caption?
BaronTreep вне форума Ответить с цитированием
Старый 14.07.2009, 14:00   #19
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
дает 36. Что-то не так!
А у меня 20
В принципе можно заключить что имена Делфи не искажает, но это скорее вредит чем приносит пользу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2009, 14:05   #20
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
missing function header (old-style formal list?)
Дааа... нужно обновлять свою литературу, а то устарела
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
dll sergei64_89 Общие вопросы .NET 1 02.08.2008 19:52
DLL MusicMan Помощь студентам 3 21.04.2008 21:30
DLL michaellos Win Api 1 16.11.2007 21:03
.DLL ZhekON Общие вопросы Delphi 3 20.05.2007 21:02
DLL Shico Win Api 1 16.04.2007 16:24