Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

function NewGetFreeSystemResources(SysResource: Word): Word;

var ThunkTrash: array[0..$20] of Word;

begin

 { Prevent the optimizer from getting rid of ThunkTrash. }

 ThunkTrash[0] := hInst16;

 hInst16 := LoadLibrary16('user.exe');

 if hInst16 < 32 then raise Exception.Create('Can''t load USER.EXE!');

 { Decrement the usage count. This doesn't really free the library, since USER.EXE is always loaded. }

 FreeLibrary16(hInst16);

 { Get the function pointer for the 16-bit function in USER.EXE. }

 GFSR := GetProcAddress16(hInst16, 'GetFreeSystemResources');

 if GFSR = nil then raise Exception.Create('Can''t get address of GetFreeSystemResources!');

 { Thunk down to USER.EXE. }

 asm

push SysResource { push arguments }

mov edx, GFSR { load 16-bit procedure pointer }

call QT_Thunk { call thunk }

mov Result, ax { save the result }

 end;

end;
 

Как

написать DLL, которую можно было-бы выполнить с помощью RunDll, RunDll32?

Из советов Nomadic'a :

Вы должны определить в программе вызываемую снаружи функцию.

Функция должна быть __stdcall (или WINAPI, что то же самое ;)) и иметь четыре аргумента. Первый – HWND окна, порождаемого rundll32 (можно использовать в качестве owner'а своих dialog box'ов), второй – HINSTANCE задачи, третий – остаток командной строки (LPCSTR, даже под NT), четвертый – не знаю ;).

Hапример –

int __stdcall __declspec(dllexport) Test (HWND hWnd, HINSTANCE hInstance, LPCSTR lpCmdLine, DWORD dummy) {

 MessageBox(hWnd, lpCmdLine, "Command Line", MB_OK);

 return 0;

}

Исполняем таким образом –

rundll32 test.dll,_Test@16 this is a command line

выдаст message box со строкой «this is a command line».

На Паскале –

Function test(hWnd: Integer; hInstance: Integer; lpCmdLine: PChar; dummy: Longint): Integer; StdCall; export;

begin

 Windows.MessageBox(hWnd, lpCmdLine, 'Command Line', MB_OK);

 Result := 0;

end;

Давненько я ждал эту информацию! Сел проверять и наткнулся на очень забавную вещь. А именно – пусть у нас есть исходник на Си пpимерно такого вида:

int WINAPI RunDll(HWND hWnd, HINSTANCE hInstance, LPCSTR lpszCmdLine, DWORD dummy);

……

int WINAPI RunDllW(HWND hWnd, HINSTANCE hInstance, LPCWSTR lpszCmdLine, DWORD dummy);

……

и .def-файл

примерно такого вида:

EXPORTS

RunDll

RunDllA=RunDll

RunDllW

то rundll32 становится разборчивой — под NT вызывает UNICODE-версию. Под 95, разумеется, ANSI.

Продукты третьих фирм 

Adobe 

Читаем Adobe Acrobat PDF файлы из нашего приложения

Igor Nikolaev aKa The Sprite советует:

Adobe Acrobat PDF — хорошо известный формат, который нравится многим пользователям. Давайте посмотрим, как можно заставить приложение на Delphi прочитать файл такого формата.

Совместимость: Delphi 3.x (или выше)

Итак, Вы должны быть уверены, что у вас проинсталлирован Acrobat Reader, если таковой программы нет, то её можно скачать с www.adobe.com После этого необходимо проинсталировать типовую библиотеку для Acrobat (Project→Import Type Library из меню Delphi) выберите "Acrobat Control for ActiveX (version x)". Где x — текущая версия библиотеки. Hажмите кнопку инсталяции. Теперь создайте новое приложение, поместите на форму проинсталлированный компонент TPDF, далее добавите OpenDialog, и в заключении кнопку, при на нажатии на которую будет вызываться процедура открытия файла:

procedure TForm1.Button1Click(Sender: TObject);

begin

 if OpenDialog1.Execute then pdf1.src := OpenDialog1.FileName;

end;

в юните PdfLib_TLB вы можете найти интерфейс класса TPdf:

TPdf = class(TOleControl)

private

 FIntf: _DPdf;

 function GetControlInterface: _DPdf;

protected

 procedure CreateControl;

 procedure InitControlData; override;

public

 function LoadFile(const fileName: WideString): WordBool;

 procedure setShowToolbar(On_: WordBool);

 procedure gotoFirstPage;

 procedure gotoLastPage;

 procedure gotoNextPage;

 procedure gotoPreviousPage;

 procedure setCurrentPage(n: Integer);

 procedure goForwardStack;

 procedure goBackwardStack;

 procedure setPageMode(const pageMode: WideString);

Поделиться с друзьями: