![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать, чтобы Win9x не искала библиотеку? [D7, Win95/98, WinME, NT4, Win2k, WinXP]
rolex © (2005-08-27 20:42:00)У меня прога должна работать в WinXP и Win9x.
Если прога запускается в WinXP, то функция берется из библиотеки (userenv.dll), а если в Win9x, то работает свой код.
в Public написал:
function GetProfilesDirectory:string;
В коде программы написал:
function ProfilesDirectory_Exp(lpProfilesDir:PChar; var lpcchSize:DWord):Bool;
stdcall; external 'userenv.dll' name 'GetProfilesDirectoryA';
function TForm1.GetProfilesDirectory:string;
var szBuffer:array[0..MAX_PATH] of Char; dwSize:DWord;
begin
dwSize := MAX_PATH;
if ProfilesDirectory_Exp(szBuffer, dwSize) then result:=szBuffer;
end;
Вызов делаю так:
if Win32Platform=VER_PLATFORM_WIN32_NT then
Переменная:=Form1.GetProfilesDirectory
else Переменная:='';
Но даже если не вызывать функцию из этой библиотеки, то при запуске проги в Win9x, вылетает ошибка, что не найдена библиотека.
Так как же сделать так, чтобы Win9x не искал её?
rolex (2005-08-27 21:42:00) [1]Нашёл пример, как загружать бибиотеку динамически:
unit untMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
Tcalc_double = function ( r: real ): real;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
hndDLLHandle: THandle;
calc_double: Tcalc_double;
begin
try
// загружаем dll динамически
hndDLLHandle := loadLibrary ( 'ExDouble.dll' );
if hndDLLHandle <> 0 then
begin
// получаем адрес функции
@calc_double := getProcAddress ( hndDLLHandle, 'calc_double' );
// если адрес функции найден
if addr ( calc_double ) <> nil then
begin
// показываем результат ( 21...)
showMessage ( floatToStr ( calc_double ( 10.5 ) ) );
end
else
// DLL не найдена ("handleable")
showMessage ( 'Function not exists...' );
end
else
// DLL не найдена ("handleable")
showMessage ( 'DLL not found...' );
finally
// liberar
freeLibrary ( hndDLLHandle );
end;
end;
end.
Но у меня при вызове ф-ции статистически (function ProfilesDirectory_Exp(lpProfilesDir:PChar; var lpcchSize:DWord):Bool;
stdcall; external 'userenv.dll' name 'GetProfilesDirectoryA';
) есть указатель (или как его назвать) name 'GetProfilesDirectoryA'. А в примере нету его.
Так куда же его написать?
begin...end (2005-08-27 20:47:00) [2]Анализировать платформу и загружать библиотеку динамически?
Sam Stone (2005-08-27 20:46:00) [3]Используй динамическую загрузку DLL (как пользовать смотри в разделе "статьи")