| Автор
| Сообщение |
|
|
|
Цитата |
|
Собственно САБЖ.
Не подскажете как реализовать, прикладываю dll
| Описание: |
|
 Скачать |
| Имя файла: |
Release.zip |
| Размер: |
54.28 KB |
| Загружен: |
415 раз(а) |
|
|
| В начало |
|
 |
|
|
 |
 Шурик
Я живу тут....

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
Мне кажется, что-то умное на эту тему может сказать DrPass. Он у нас знает всего понемножку.
Насколько помню, Delphi понимает Майкрософтовские obj файлы. Правда сам никогда этого не проверял. А вот классы из dll...
А dll сторонняя? Доступа к коду нет?
_________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
 Phantom
Постоянный участник

Возраст: 37
Знак зодиака: 
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
|
|
|
Цитата |
|
можно проверить какие функции 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('Произошла ошибка'); |
|
|
| В начало |
|
 |
|
|
|
Цитата |
|
SymSetOptions(SYMOPT_UNDNAME or SYMOPT_DEFERRED_LOADS); у данной функции есть зависимости, которых я не знаю,
не подскажете?
|
|
| В начало |
|
 |
 Phantom
Постоянный участник

Возраст: 37
Знак зодиака: 
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
|
|
|
Цитата |
|
Забыл указать
uses
...
ImageHlp;
....
или
объяви
const
SYMOPT_UNDNAME = $00000002;
SYMOPT_DEFERRED_LOADS = $00000004;
|
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
Умное, так умное
| Цитата: | | Насколько помню, Delphi понимает Майкрософтовские obj файлы |
В том то и дело, что не понимает. Можно, конечно, попробовать конвертнуть их в OMF-формат... но качественного и 100% работающего конвертера я не встречал.
Что касается импорта сишных классов, такая DLL на самом деле является близким аналогом BPL-пакета. Сишный компилятор в ней генерирует функции-оболочки для public-методов класса. Поскольку разбирать сишные name-mangling изыски здоровому человеку нереально, я бы просто посмотрел табличку экспорта в DLL (tdimp, FAR+PEEditor и т.д) и импортировал их по индексам
_________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 Phantom
Постоянный участник

Возраст: 37
Знак зодиака: 
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
|
|
|
Цитата |
|
Дык я это же и предложил только в виде кода
|
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
to Phantom
Это понятно. А код-то зачем?
_________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 Phantom
Постоянный участник

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

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
/*извини за занудство*/
А нафиг в проекте лишний код???
_________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 Phantom
Постоянный участник

Возраст: 37
Знак зодиака: 
Зарегистрирован: 16.05.2002
Сообщения: 160
Откуда: Омск
|
|
|
Цитата |
|
| DrPass писал(а): | /*извини за занудство*/
А нафиг в проекте лишний код???  |
Уточню
мой код вкючать в проект в котором будет использоваться данная dll не нужно
А вот для написания собственной утилитки отображающей функции dll если нет PEEditorа под рукой и Delphi пригодится делов то брость на форму listbox и кнопку и скопировать 2 процедурки
кстати вернет мой код следующее:
CGTVRemote::operator=
CGTVRemote::CGTVRemote
CGTVRemote::~CGTVRemote
CGTVRemote::GetCode
CGTVRemote::GetDeviceName
CGTVRemote::SelectDevice
Добавлено спустя 24 минуты 7 секунд:
to gonzales
пробуй подключить этот модуль
| delphi: | unit GTVREMOTE; interface uses {$IFDEF WIN32} Windows; {$ELSE} Wintypes, WinProcs; {$ENDIF} {$IFDEF GTVREMOTE_EXPORTS} const GTVREMOTE_API = __declspec(dllexport); {$ELSE} const GTVREMOTE_API = __declspec(dllimport); {$ENDIF} {/// This class is exported from the gtvremote.dll } {/// Поддерживаемые тв тюнеры: } {/// 1 - GoTView PCI (Conexant драйвер) } {/// 2 - GoTView PCI (Gotview драйвер) } {/// 3 - GoTView PCI 7134 } {/// 4 - GoTView PCI 7135 } {/// 5 - GoTView PCI DVD (IVAC15 драйвер) } {/// 6 - GoTView PCI DVD (Falcon2 драйвер) } type CARD_TYPE = ( CARD_UNKNOWN{=0}, CARD_878_CX{=1}, CARD_878_GT{=2}, CARD_7134{=3}, CARD_7135{=4}, CARD_DVD_IVAC{=5}, CARD_DVD_FALCON{=6 } ); var CGTVRemote: function: PUBLIC: cdecl {$IFDEF WIN32} stdcall {$ENDIF}; var ~CGTVRemote: function: Integer cdecl {$IFDEF WIN32} stdcall {$ENDIF}; {/// Возвращает в dwCode код нажатой клавиши, либо 0xFF, если клавиша не нажата. } {/// HRESULT - код ошибки или S_OK; } var GetCode: function(var dwCode: BYTE): HRESULT cdecl {$IFDEF WIN32} stdcall {$ENDIF}; {/// Возвращает имя Video-In устройства, либо NULL, если devnum+1 больше чем устройств в системе; } var GetDeviceName: function(devnum: LongInt): PChar cdecl {$IFDEF WIN32} stdcall {$ENDIF}; {/// Выбор устройства Video-In. Возвращает HRESULT код ошибки или S_OK; 0 - 1-устройство. } var SelectDevice: function(devnum: LongInt): HRESULT cdecl {$IFDEF WIN32} stdcall {$ENDIF}; {/// Для карт на bt878 чипе (GoTView PCI) было 2 модификации контроллеров ДУ. Если не работают кнопки вправо и влево - надо поставить m_bChipTypeTM=true; } {/// Для "не bt878" карт влияния не оказывает. } var DLLLoaded: Boolean { is DLL (dynamically) loaded already? } {$IFDEF WIN32} = False; {$ENDIF} implementation var SaveExit: pointer; DLLHandle: THandle; {$IFNDEF MSDOS} ErrorMode: Integer; {$ENDIF} procedure NewExit; far; begin ExitProc := SaveExit; FreeLibrary(DLLHandle) end {NewExit}; procedure LoadDLL; begin if DLLLoaded then Exit; {$IFNDEF MSDOS} ErrorMode := SetErrorMode($8000{SEM_NoOpenFileErrorBox}); {$ENDIF} DLLHandle := LoadLibrary('GTVREMOTE.DLL'); if DLLHandle >= 32 then begin DLLLoaded := True; SaveExit := ExitProc; ExitProc := @NewExit; @CGTVRemote := GetProcAddress(DLLHandle,'CGTVRemote'); {$IFDEF WIN32} Assert(@CGTVRemote <> nil); {$ENDIF} @~CGTVRemote := GetProcAddress(DLLHandle,'~CGTVRemote'); {$IFDEF WIN32} Assert(@~CGTVRemote <> nil); {$ENDIF} @GetCode := GetProcAddress(DLLHandle,'GetCode'); {$IFDEF WIN32} Assert(@GetCode <> nil); {$ENDIF} @GetDeviceName := GetProcAddress(DLLHandle,'GetDeviceName'); {$IFDEF WIN32} Assert(@GetDeviceName <> nil); {$ENDIF} @SelectDevice := GetProcAddress(DLLHandle,'SelectDevice'); {$IFDEF WIN32} Assert(@SelectDevice <> nil); {$ENDIF} end else begin DLLLoaded := False; { Error: GTVREMOTE.DLL could not be loaded !! } end; {$IFNDEF MSDOS} SetErrorMode(ErrorMode) {$ENDIF} end {LoadDLL}; begin LoadDLL; end.
|
|
|
| В начало |
|
 |
|