Вопросы и решения

Статус
В этой теме нельзя размещать новые ответы.

Mailchik

Старожил
Проверенный
sergey3695, у тебя в дельфи:
function GetFileWorkingDirectoryFromLink(LinkFileName: string): string;
а в инно:
procedure GetFileWorkingDirectoryFromLink(LinkFileName: string); external 'GetFileWorkingDirectoryFromLink@{tmp}\Link.dll stdcall delayload';
в одной функция, в другой процедура..
процедура ничего не вернет, тем более не существующая.
 

SotM

Участник
Проверенный
Mailchik, ты не понял,нельзя передавать из библиотеки функцию типа String,а созданную в инно можно
2 AVG
Наверное ты хотел сказать не "передавать", а "возвращать" ?
Например:
function GetDriveType(lpRootPathName: string): UINT;
здесь строка передается.

А здесь:
function DriveTypeStr(sDrive: string): string;
Функция возвращает строку.
 

sergey3695

Ветеран
Модератор
Mailchik, это я тут неправильно написал просто. в инно
Код:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl

[Files]
Source: Link.dll; DestDir: {tmp}; Flags: dontcopy

[Code\]
function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('Link.dll');
  Result:= True;
end;

function GetFileWorkingDirectoryFromLink(pszDir: ansistring): ansistring; external 'GetFileWorkingDirectoryLink@Link.dll stdcall delayload';

procedure InitializeWizard;
begin
if GetFileWorkingDirectoryFromLink(ExpandConstant('{userdesktop}\Crysis 2.lnk')) = 'D:\Games\Crysis 2\Setup.exe' then
  DeleteFile(ExpandConstant('{userdesktop}\Crysis 2.lnk'));
end;
скрин ошибки выше. в делфи проверял, функция рабочая,а вот в инно не робит.
 

sergey3695

Ветеран
Модератор
все равно не работает
скрипт инно
Код:
function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('Link.dll');
  Result:= True;
end;

function GetFileWorkingDirectoryFromLink(LinkFileName,Dir: string): Bool; external 'GetFileWorkingDirectoryFromLink@Link.dll stdcall delayload';

procedure InitializeWizard;
begin
if GetFileWorkingDirectoryFromLink(ExpandConstant('{userdesktop}\Crysis 2.lnk'),'D:\Games\Crysis 2\Setup.exe') then
  DeleteFile(ExpandConstant('{userdesktop}\Crysis 2.lnk'));
end;
скрипт делфи
Код:
library Link;

uses
  ComObj, SysUtils, Windows, ActiveX, System, ShlObj;

function GetFileWorkingDirectoryFromLink(LinkFileName,Dir: string): Bool; stdcall;
var
MyObject: IUnknown;
MySLink: IShellLink;
MyPFile: IPersistFile;
WidePath: array[0..MAX_PATH] of WideChar;
Buff: array[0..MAX_PATH] of Char;
begin
if ( FileExists( LinkFileName ) = false ) then
begin
Result := false;
end else begin
MyObject := CreateComObject( CLSID_ShellLink );
MyPFile := MyObject as IPersistFile;
MySLink := MyObject as IShellLink;
StringToWideChar( LinkFileName, WidePath, SizeOf( WidePath ) );
MyPFile.Load( WidePath, STGM_READ );
MySLink.GetWorkingDirectory( Buff, MAX_PATH );
if (buff = dir) then
begin
Result := True;
end else begin
Result := False;
end;
end;
end;

exports
  GetFileWorkingDirectoryFromLink;

begin
end.
 
Последнее редактирование:

David.D.Rocco

Участник
Проверенный
sergey3695,
Код:
function GetFileWorkingDirectoryFromLink(LinkFileName,Dir: string): Bool; external 'DeskTop@[COLOR="Red"]{tmp}\[/COLOR]Link.dll stdcall delayload';
 

sergey3695

Ветеран
Модератор
David.D.Rocco, о, все заработало. вот это я нубло, ппц. может кто-нибудь фак или ссылки на книжочки по данной тематики подкинет, я б почитал на досуге. Спасибо большое всем тем кто помогал.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху