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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2011, 09:20   #1
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
Стрелка Экспорт из *.dll

Код:
function SerialNumber(SNIndex: Integer): PChar; stdcall; external 'DbLib.dll';
function AC(ACIndex: Integer): PChar; stdcall; external 'DbLib.dll';
function LoadAddress(LAIndex: Integer): PChar; stdcall; external 'DbLib.dll';
function LoadTelephone(LTIndex: Integer): PChar; stdcall; external 'DbLib.dll';
function LoadEmail(LEIndex: Integer): PChar; stdcall; external 'DbLib.dll';
function LoadWeb(LWIndex: Integer): PChar; stdcall; external 'DbLib.dll';
так выглядит сейчас. сравнительно недавно работаю с длл. подскажите, как это можно свести в более презентабельный вид? библиотека как видите используется одна и та же, а функции в ней разные.
BingoBongo вне форума Ответить с цитированием
Старый 09.05.2011, 12:50   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Можно вот изврашённый способ динамической загрузкой:

только новый тип пропиши:
Код:
Type 
   TCallFunc = function (aInt:integer):Pchar;
Код:
function CallDllFunc(aFuncName: string; aFuncParam: integer): PChar;
const
  CallDLL = 'DbLib.dll';
var
  DH: THandle;
  Func: TcallFunc;
begin
  DH := LoadLibrary(PAnsiChar(CallDLL));
  if DH <> 0 then
  begin
    @Func := GetProcAddress(DH, PAnsiChar(aFuncName));
    if @Func <> nil then
    begin
      Result := Func(aFuncParam);
    end
    else
    begin
      ShowMessage('Функция "' + aFuncName + '" не найдена в DLL!');
      Result := nil;
    end;
  end
  else
  begin
    ShowMessage('Не найдена DLL для загрузки.');
    Result := nil;
  end;
end;
Использование:
Код:
{
SerialNumber
AC
LoadAddress
LoadTelephone
LoadEmail
LoadWeb
}

var
   TrollFace:Pchar;
begin
TrollFace:=callDllFunc('SerialNumber',1);
If TrollFace <> nil then
begin

end;
end;

С тебя спасибо и +.
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 12:53   #3
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от BingoBongo Посмотреть сообщение
как это можно свести в более презентабельный вид?
Если только совсем чуть:

Код:
const
  DbLib = 'DbLib.dll';

function SerialNumber(SNIndex: Integer): PChar; stdcall; external DbLib;
function AC(ACIndex: Integer): PChar; stdcall; external DbLib;
function LoadAddress(LAIndex: Integer): PChar; stdcall; external DbLib;
function LoadTelephone(LTIndex: Integer): PChar; stdcall; external DbLib;
function LoadEmail(LEIndex: Integer): PChar; stdcall; external DbLib;
function LoadWeb(LWIndex: Integer): PChar; stdcall; external DbLib;
А так - нормально. Лучше уже некуда.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2011, 13:03   #4
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Можно вот изврашённый способ динамической загрузкой:

только новый тип пропиши:
Код:
Type 
   TCallFunc = function (aInt:integer):Pchar;
Код:
function CallDllFunc(aFuncName: string; aFuncParam: integer): PChar;
const
  CallDLL = 'DbLib.dll';
var
  DH: THandle;
  Func: TcallFunc;
begin
  DH := LoadLibrary(PAnsiChar(CallDLL));
  if DH <> 0 then
  begin
    @Func := GetProcAddress(DH, PAnsiChar(aFuncName));
    if @Func <> nil then
    begin
      Result := Func(aFuncParam);
    end
    else
    begin
      ShowMessage('Функция "' + aFuncName + '" не найдена в DLL!');
      Result := nil;
    end;
  end
  else
  begin
    ShowMessage('Не найдена DLL для загрузки.');
    Result := nil;
  end;
end;
Использование:
Код:
{
SerialNumber
AC
LoadAddress
LoadTelephone
LoadEmail
LoadWeb
}

var
   TrollFace:Pchar;
begin
TrollFace:=callDllFunc('SerialNumber',1);
If TrollFace <> nil then
begin

end;
end;

С тебя спасибо и +.
мда уж. упростили. все равно спасибо.
BingoBongo вне форума Ответить с цитированием
Старый 09.05.2011, 13:05   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

P.S. Подсказка: можно выписать все функции в виде

Код:
function LoadWeb(LWIndex: Integer): PChar; stdcall;
а потом сделать Search&Replace "stdcall;" -> "stdcall; external DbLib;"
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2011, 13:09   #6
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Если только совсем чуть:

Код:
const
  DbLib = 'DbLib.dll';

function SerialNumber(SNIndex: Integer): PChar; stdcall; external DbLib;
function AC(ACIndex: Integer): PChar; stdcall; external DbLib;
function LoadAddress(LAIndex: Integer): PChar; stdcall; external DbLib;
function LoadTelephone(LTIndex: Integer): PChar; stdcall; external DbLib;
function LoadEmail(LEIndex: Integer): PChar; stdcall; external DbLib;
function LoadWeb(LWIndex: Integer): PChar; stdcall; external DbLib;
А так - нормально. Лучше уже некуда.
да я уже понял после первого варианта
тоже спасибо )
BingoBongo вне форума Ответить с цитированием
Старый 09.05.2011, 13:11   #7
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
P.S. Подсказка: можно выписать все функции в виде

Код:
function LoadWeb(LWIndex: Integer): PChar; stdcall;
а потом сделать Search&Replace "stdcall;" -> "stdcall; external DbLib;"
а это я не понял. поиск то где вести придется ?
BingoBongo вне форума Ответить с цитированием
Старый 09.05.2011, 13:14   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

в редакторе кода. Ctrl+F никто не отменил :D
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 13:28   #9
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

GunSmoker )) до того популярно разрулил ситуацию, что я аж сначала не понял о чем речь)

спасибо за совет )

Человек_Борща, мде, действительно, Ctrl+F работает )
BingoBongo вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт функции C++ в библиотеку DLL lebedevmd Фриланс 2 12.04.2011 14:45
Почему при написании dll без rtl не выходит экспорт функции?? dolphin705 Общие вопросы Delphi 13 02.02.2011 18:48
Экспорт классов в DLL _-Re@l-_ Паскаль, Turbo Pascal, PascalABC.NET 16 17.11.2010 21:25
экспорт в dll varelik Общие вопросы Delphi 3 13.01.2010 11:30
экспорт классов из Dll Alar Общие вопросы Delphi 0 29.10.2006 21:53