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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2015, 12:21   #1
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию Вызов функций в dll

Может кто знает функционал который позволяет вызывать функцию в dll библиотеке ?

Пример - Подобно этому?

Код:
$result = DllCall("user32.dll", "int", "MessageBox", "hwnd", 0, "str", "Некоторый текст", "str", "Такой вот заголовок", "int", 0)
Должно быть имя? вне форума Ответить с цитированием
Старый 20.05.2015, 16:46   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Чтобы именно такой диалог вызвать в Delphi используй функцию MessageBox и всё.
FaTaL вне форума Ответить с цитированием
Старый 20.05.2015, 17:08   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

LoadLibrary + F1 (смотри справку)
и далее по ссылкам (SeeAlso) из справки или google Search
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.05.2015, 18:48   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Э-э-э... Есть еще два способа:
1) rundll из стандартной поставки винды
2) Так уж и быть, похвастаюсь - зафигачить свой собственный вызов на ассемблере, получив хендл библиотеки (как evg_m говорит) и адрес функции. Типа пример тут: http://www.programmersforum.ru/showp...8&postcount=66
Но это как механизм, копипастить его не получится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.05.2015, 21:26   #5
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Чтобы именно такой диалог вызвать в Delphi используй функцию MessageBox и всё.
Цитата:
Сообщение от evg_m Посмотреть сообщение
LoadLibrary + F1 (смотри справку)
и далее по ссылкам (SeeAlso) из справки или google Search
Нет, и нет, совсем не то.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Э-э-э... Есть еще два способа:
1) rundll из стандартной поставки винды
2) Так уж и быть, похвастаюсь - зафигачить свой собственный вызов на ассемблере, получив хендл библиотеки (как evg_m говорит) и адрес функции. Типа пример тут: http://www.programmersforum.ru/showp...8&postcount=66
Но это как механизм, копипастить его не получится.
Ага, ага, видал подобное, но уже в готовом решение
Код:


function sprintf(out, fmt: Pchar; args: array of const): Integer;
var
  I: Integer;
  BufPtr: Pchar;
  S: string;
  buf: array[0..1024] of char;
begin
  BufPtr := buf;
  // Формируем буффер параметров. Можно, конечно, и прямо на стеке,
  // но головной боли слишком много - проще так
  for I := low(Par) to High(Par) do
    case Par[I].VType of
      vtInteger: // Здесь все просто - 4 байта на стек
        begin
          Integer(Pointer(BufPtr)^) := Par[I].VInteger;
          Inc(BufPtr, 4);
        end;
      vtExtended: // Здесь хуже - слова надо местами поменять :-((
        begin
          Integer(Pointer(BufPtr)^) :=
            Integer(Pointer(Pchar(Par[I].VExtended) + 4)^);
          Inc(BufPtr, 4);
          Integer(Pointer(BufPtr)^) :=
            Integer(Pointer(Par[I].VExtended)^);
          Inc(BufPtr, 4);
        end;
      vtPChar: // Здесь тоже все хорошо - 4 байта
        begin
          Pointer(Pointer(BufPtr)^) := Par[I].VPchar;
          Inc(BufPtr, 4);
        end;
      vtString, vtAnsiString: // А здесь во избежание чудес надо
        // копию строки снять
        begin
          if Par[I].VType = vtString then
            S := Par[I].VString^
          else
            S := string(Par[I].VAnsiString);
          Pointer(Pointer(BufPtr)^ :=
            StrPCopy(StrAlloc(Length(S) + 1), S);
            Inc(BufPtr, 4);
        end;
    end;
  // Поддержку других типов доделывать самостоятельно,
  // вооружившись толковым пособием по с и ассемблеру

  I := (BufPtr - buf) div 4; // Сколько раз на стек слово положить

  asm
      push dword ptr [out]
      push dword ptr [fmt]
      mov ecx, dword ptr [i]
      mov eax, dword ptr [buf]  // stdcall - параметры в прямом
                                // порядке
      @@1:
      push dword ptr [eax]
      add  eax, 4
      loop @@1
      call [wsprintf]
      mov  dword ptr [Result], eax // Сохранить результат
      mov eax, dword ptr [i]       // Привести в порядок стек
      shl eax, 2
      add eax, 8
      add esp, eax
  end;
  // Почистить строки
  for I := low(Par) to High(Par) do
    case Par[I].VType of
      vtInteger: Inc(BufPtr, 4);
      vtExtended: Inc(BufPtr, 8);
      vtPChar: Inc(BufPtr, 4);
      vtString, vtAnsiString:
        begin
          StrDispose(PChar(PPointer(BufPtr)^));
          Inc(BufPtr, 4);
        end;
    end;
end;
Ну хоть кто то понял меня.. А я еще слышал о RemObjects думаю и там покопаться, неплохой интерпретированный проект
Должно быть имя? вне форума Ответить с цитированием
Старый 20.05.2015, 21:46   #6
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от Должно быть имя? Посмотреть сообщение
Может кто знает функционал который позволяет вызывать функцию в dll библиотеке ?
В обычных DLL нет RTTI, поэтому следить за соглашением вызова, типом и порядком параметров должна вызывающая сторона. Можно это делать в виде самописных оберток, можно использовать что-то готовое. Если способ обеспечения RTTI известен, этот кусок можно хоть целиком на ассемблере написать.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 20.05.2015, 22:18   #7
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
В обычных DLL нет RTTI, поэтому следить за соглашением вызова, типом и порядком параметров должна вызывающая сторона. Можно это делать в виде самописных оберток, можно использовать что-то готовое. Если способ обеспечения RTTI известен, этот кусок можно хоть целиком на ассемблере написать.
Ну и у WinApi библиотек его тем более нету... Тут и введется разговор, об вызове с описаниям параметров. хотя эти параметры из самого же string можно конвертировать в нужный тип... Но мучиться не охота. Охота готового. Та и мало опыта, чтоб создавать стэке на Asm плохо понимая, какой результат будет на 64 битной версии, или на другом процессоре
Должно быть имя? вне форума Ответить с цитированием
Старый 21.05.2015, 02:09   #8
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

А для чего это делается, позвольте поинтересоваться? В таком виде вызов функций нужен лишь при разработке своего языка или чего-то похожего, типа среды программирования.

Пример с sprintf полон быдлокода, однако.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 21.05.2015, 03:03   #9
Должно быть имя?
Пользователь
 
Регистрация: 11.04.2015
Сообщений: 68
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
А для чего это делается, позвольте поинтересоваться? В таком виде вызов функций нужен лишь при разработке своего языка или чего-то похожего, типа среды программирования.

Пример с sprintf полон быдлокода, однако.
Все верно, это для PHP от нефиг делать подключил. И вот клепаю в свободное время. sprintf я и не собирался использовать, самому противно, портить красивый код таким
Должно быть имя? вне форума Ответить с цитированием
Старый 21.05.2015, 07:27   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Для ПХП? Ты типа плагина пишешь к нему?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dll в ресурсах и вызов функций из нее Obsever0 Общие вопросы Delphi 15 15.09.2015 23:46
Вызов функций из Dll Mik92 Общие вопросы Delphi 2 19.09.2014 19:00
Вызов функций из DLL в исполняемом файле. coNsept Общие вопросы .NET 0 12.12.2013 02:23
Вызов функций из DLL написанной на Delphi Boris777 Общие вопросы C/C++ 2 20.12.2011 10:53