Я например делал так (упрощенно опишу): В программе:
| Код | const ID_PROGRESS = 101; var hWin: HWND;//хендл главного окна LibHandle: THandle; MyFunction: function(hWin:HWND;hProgress:HWND):boolean;stdcall; ...
LibHandle := LoadLibrary('mydll.dll'); if LibHandle <> 0 then begin @MyFunction := getProcAddress (LibHandle, '_MyFunction'); if Assigned ( MyFunction ) then begin MyFunction(hWin,GetDlgItem(hWin, ID_PROGRESS)); end else begin MessageBox(hWin,'Function not found : _MyFunction','Error',MB_OK); end; end else begin MessageBox(hWin,'DLL not found : mydll.dll'l,'Error',MB_OK); end; freeLibrary ( LibHandle );
|
В библиотеке:
| Код |
uses Windows;
const PBM_SETRANGE = WM_USER+1; PBM_SETPOS = WM_USER+2;
...
//Установка минимальной и максимальной позиции ProgressBar function Progress_SetRange(hProgress: HWND; nMinRange: wParam; nMaxRange: lParam): DWORD; begin Result := SendMessage(hProgress, PBM_SETRANGE, 0, MAKELPARAM(nMinRange, nMaxRange)); end;
//Устанавливаем позицию ProgressBar function Progress_SetPos(hProgress: HWND; nNewPos: wParam): Integer; begin Result := SendMessage(hProgress, PBM_SETPOS, nNewPos, 0); end;
function ProcessMessages : Boolean; const WM_QUIT = $0012; var Msg : TMsg; begin Result := False; while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do begin if Msg.Message = WM_QUIT then begin Exit end else begin TranslateMessage(Msg); DispatchMessage(Msg); end; end; Result := True; end;
Function MyFunction(hWin:HWND;hProgress:HWND):boolean;stdcall; var i:integer; begin //выполняешь действия с прогресс-баром Progress_SetRange(hProgress,0,1000); //начало цикла Progress_SetPos(hProgress,i); ProcessMessages; //конец цикла end; ... exports MyFunction name '_MyFunction';
|
Принцип думаю понятен, у меня все работало как надо, и размер библиотеки получался не более 100 кб (так как используется в основном WinAPI). |