Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Импорт классов из dll, написанной на C++


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
gonzales
Гость







СообщениеСр, 05-Апр-2006 19:56    Заголовок сообщения: Импорт классов из dll, написанной на C++
Цитата

Собственно САБЖ.

Не подскажете как реализовать, прикладываю dll



Release.zip
 Описание:

Скачать
 Имя файла:  Release.zip
 Размер:  54.28 KB
 Загружен:  415 раз(а)

В начало
Пол:Муж Шурик
Я живу тут....


Возраст: 42
Знак зодиака: Овен
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
СообщениеЧт, 06-Апр-2006 2:49 
Цитата

Мне кажется, что-то умное на эту тему может сказать DrPass. Он у нас знает всего понемножку.

Насколько помню, Delphi понимает Майкрософтовские obj файлы. Правда сам никогда этого не проверял. А вот классы из dll...

А dll сторонняя? Доступа к коду нет?

_________________
Ответ готов, готов ли твой вопрос?
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Пол:Муж Phantom
Постоянный участник


Возраст: 37
Знак зодиака: Козерог
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
СообщениеЧт, 06-Апр-2006 4:10 
Цитата

можно проверить какие функции dll экспортирует:
Код:
function EnumSymbols(SymbolName: PChar; SymbolAddress, SymbolSize: ULONG;
  Strings: Pointer): Bool; stdcall;
begin
  TStrings(Strings).Add(SymbolName);
  Result := True;
end;

function GetImageFunctionList(const FileName: string; Strings: TStrings):
  Boolean;

var
  Handle: THandle;
  hProcess: THandle;
  VersionInfo: TOSVersionInfo;
begin
  Strings.Clear;
  Result := False;

  SymSetOptions(SYMOPT_UNDNAME or SYMOPT_DEFERRED_LOADS);

  VersionInfo.dwOSVersionInfoSize := SizeOf(VersionInfo);
  if not GetVersionEx(VersionInfo) then
    Exit;

  if VersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS then
    hProcess := GetCurrentProcessId
  else
    hProcess := GetCurrentProcess;

  if not SymInitialize(hProcess, nil, True) then
    Exit;
  try
    Handle := LoadLibrary(PChar(FileName));
    if Handle = 0 then
      Exit;
    try
      if not SymLoadModule(hProcess, 0, PChar(FileName), nil, Handle, 0) then
        Exit;
      try
        if not SymEnumerateSymbols(hProcess, Handle, EnumSymbols, Strings) then
          Exit;
      finally
        SymUnloadModule(hProcess, Handle);
      end;
    finally
      FreeLibrary(Handle);
    end;
  finally
    SymCleanup(hProcess);
  end;
  Result := True;
end;
Пример использования:

Код:
if not GetImageFunctionList('kernel32.dll', ListBox1.Items) then
  raise Exception.Create('Произошла ошибка');
В начало
Посмотреть профиль Отправить личное сообщение
gonzales
Гость







СообщениеЧт, 06-Апр-2006 11:00 
Цитата

SymSetOptions(SYMOPT_UNDNAME or SYMOPT_DEFERRED_LOADS); у данной функции есть зависимости, которых я не знаю,
не подскажете?
В начало
Пол:Муж Phantom
Постоянный участник


Возраст: 37
Знак зодиака: Козерог
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
СообщениеЧт, 06-Апр-2006 11:09 
Цитата

Забыл указать :(
uses
...
ImageHlp;
....

или
объяви
const
SYMOPT_UNDNAME = $00000002;
SYMOPT_DEFERRED_LOADS = $00000004;
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеЧт, 06-Апр-2006 11:12 
Цитата

Умное, так умное Wink
Цитата:
Насколько помню, Delphi понимает Майкрософтовские obj файлы

В том то и дело, что не понимает. Можно, конечно, попробовать конвертнуть их в OMF-формат... но качественного и 100% работающего конвертера я не встречал.
Что касается импорта сишных классов, такая DLL на самом деле является близким аналогом BPL-пакета. Сишный компилятор в ней генерирует функции-оболочки для public-методов класса. Поскольку разбирать сишные name-mangling изыски здоровому человеку нереально, я бы просто посмотрел табличку экспорта в DLL (tdimp, FAR+PEEditor и т.д) и импортировал их по индексам

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Phantom
Постоянный участник


Возраст: 37
Знак зодиака: Козерог
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
СообщениеЧт, 06-Апр-2006 11:21 
Цитата

Дык я это же и предложил только в виде кода ;)
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеЧт, 06-Апр-2006 15:41 
Цитата

to Phantom
Это понятно. А код-то зачем? Wink

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Phantom
Постоянный участник


Возраст: 37
Знак зодиака: Козерог
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
СообщениеПт, 07-Апр-2006 4:02 
Цитата

Код в проект вставил и все готово а так бы пришлось объяснять что такое PE-Editor и зачеми он нужен :)
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 07-Апр-2006 9:11 
Цитата

/*извини за занудство*/
А нафиг в проекте лишний код??? Wink

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Phantom
Постоянный участник


Возраст: 37
Знак зодиака: Козерог
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
СообщениеСб, 08-Апр-2006 5:45 
Цитата

DrPass писал(а):
/*извини за занудство*/
А нафиг в проекте лишний код??? Wink


Уточню
мой код вкючать в проект в котором будет использоваться данная dll не нужно ;)
А вот для написания собственной утилитки отображающей функции dll если нет PEEditorа под рукой и Delphi пригодится делов то брость на форму listbox и кнопку и скопировать 2 процедурки;)

кстати вернет мой код следующее:
CGTVRemote::operator=
CGTVRemote::CGTVRemote
CGTVRemote::~CGTVRemote
CGTVRemote::GetCode
CGTVRemote::GetDeviceName
CGTVRemote::SelectDevice

Добавлено спустя 24 минуты 7 секунд:

to gonzales
пробуй подключить этот модуль
delphi:
  1. unit GTVREMOTE;
  2.  
  3. interface
  4. uses
  5. {$IFDEF WIN32}
  6.   Windows;
  7. {$ELSE}
  8.   Wintypes, WinProcs;
  9. {$ENDIF}
  10.  
  11.  
  12.  
  13.  
  14. {$IFDEF GTVREMOTE_EXPORTS}
  15. const
  16.   GTVREMOTE_API = __declspec(dllexport);
  17. {$ELSE}
  18. const
  19.   GTVREMOTE_API = __declspec(dllimport);
  20. {$ENDIF}
  21.  
  22. {/// This class is exported from the gtvremote.dll }
  23.  
  24.  
  25. {/// Поддерживаемые тв тюнеры: }
  26. {/// 1 - GoTView PCI (Conexant драйвер) }
  27. {/// 2 - GoTView PCI (Gotview драйвер) }
  28. {/// 3 - GoTView PCI 7134 }
  29. {/// 4 - GoTView PCI 7135 }
  30. {/// 5 - GoTView PCI DVD (IVAC15 драйвер) }
  31. {/// 6 - GoTView PCI DVD (Falcon2 драйвер) }
  32.  
  33. type
  34.   CARD_TYPE = (
  35.     CARD_UNKNOWN{=0},
  36.     CARD_878_CX{=1},
  37.     CARD_878_GT{=2},
  38.     CARD_7134{=3},
  39.     CARD_7135{=4},
  40.     CARD_DVD_IVAC{=5},
  41.     CARD_DVD_FALCON{=6 } );
  42.  
  43.  
  44. var
  45.   CGTVRemote: function: PUBLIC: cdecl  {$IFDEF WIN32} stdcall {$ENDIF};
  46. var
  47.   ~CGTVRemote: function: Integer cdecl  {$IFDEF WIN32} stdcall {$ENDIF};
  48.  
  49. {/// Возвращает в dwCode код нажатой клавиши, либо 0xFF, если клавиша не нажата. }
  50. {/// HRESULT - код ошибки или S_OK; }
  51. var
  52.   GetCode: function(var dwCode: BYTE): HRESULT cdecl  {$IFDEF WIN32} stdcall {$ENDIF};
  53. {/// Возвращает имя Video-In устройства, либо NULL, если devnum+1 больше чем устройств в системе; }
  54. var
  55.   GetDeviceName: function(devnum: LongInt): PChar cdecl  {$IFDEF WIN32} stdcall {$ENDIF};
  56. {/// Выбор устройства Video-In. Возвращает HRESULT код ошибки или S_OK; 0 - 1-устройство. }
  57. var
  58.   SelectDevice: function(devnum: LongInt): HRESULT cdecl  {$IFDEF WIN32} stdcall {$ENDIF};
  59. {/// Для карт на bt878 чипе (GoTView PCI) было 2 модификации контроллеров ДУ. Если не работают кнопки вправо и влево - надо поставить m_bChipTypeTM=true; }
  60. {/// Для "не bt878" карт влияния не оказывает. }
  61.  
  62.  
  63. var
  64.   DLLLoaded: Boolean { is DLL (dynamically) loaded already? }
  65.     {$IFDEF WIN32} = False; {$ENDIF}
  66.  
  67. implementation
  68.  
  69. var
  70.   SaveExit: pointer;
  71.   DLLHandle: THandle;
  72. {$IFNDEF MSDOS}
  73.   ErrorMode: Integer;
  74. {$ENDIF}
  75.  
  76.   procedure NewExit; far;
  77.   begin
  78.     ExitProc := SaveExit;
  79.     FreeLibrary(DLLHandle)
  80.   end {NewExit};
  81.  
  82. procedure LoadDLL;
  83. begin
  84.   if DLLLoaded then Exit;
  85. {$IFNDEF MSDOS}
  86.   ErrorMode := SetErrorMode($8000{SEM_NoOpenFileErrorBox});
  87. {$ENDIF}
  88.   DLLHandle := LoadLibrary('GTVREMOTE.DLL');
  89.   if DLLHandle >= 32 then
  90.   begin
  91.     DLLLoaded := True;
  92.     SaveExit := ExitProc;
  93.     ExitProc := @NewExit;
  94.     @CGTVRemote := GetProcAddress(DLLHandle,'CGTVRemote');
  95.   {$IFDEF WIN32}
  96.     Assert(@CGTVRemote <> nil);
  97.   {$ENDIF}
  98.     @~CGTVRemote := GetProcAddress(DLLHandle,'~CGTVRemote');
  99.   {$IFDEF WIN32}
  100.     Assert(@~CGTVRemote <> nil);
  101.   {$ENDIF}
  102.     @GetCode := GetProcAddress(DLLHandle,'GetCode');
  103.   {$IFDEF WIN32}
  104.     Assert(@GetCode <> nil);
  105.   {$ENDIF}
  106.     @GetDeviceName := GetProcAddress(DLLHandle,'GetDeviceName');
  107.   {$IFDEF WIN32}
  108.     Assert(@GetDeviceName <> nil);
  109.   {$ENDIF}
  110.     @SelectDevice := GetProcAddress(DLLHandle,'SelectDevice');
  111.   {$IFDEF WIN32}
  112.     Assert(@SelectDevice <> nil);
  113.   {$ENDIF}
  114.   end
  115.   else
  116.   begin
  117.     DLLLoaded := False;
  118.     { Error: GTVREMOTE.DLL could not be loaded !! }
  119.   end;
  120. {$IFNDEF MSDOS}
  121.   SetErrorMode(ErrorMode)
  122. {$ENDIF}
  123. end {LoadDLL};
  124.  
  125. begin
  126.   LoadDLL;
  127. end.
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100