2014-12-10 1 views
2

Inno Setup을 사용하고 있습니다. 설치된 응용 프로그램이 여러 번 설치할 수 있으므로 여러 시작 메뉴 바로 가기가 만들어집니다. 내가 겪고있는 문제는 여러 아이콘이 동일한 응용 프로그램 위치 (중복)에 생성된다는 것입니다. 내 솔루션은 설치 과정에서 기존 시작 메뉴 바로 가기를 확인하고 바로 가기의 작업 또는 대상 디렉토리 속성을 읽고 현재 설치 디렉토리와 비교하여 확인합니다. 단축키 중 하나에 일치하는 것이 있으면 바로 가기를 설치하지 마십시오.Inno 설치 : IShellLink를 사용하여 액세스 위반 GetWorkingDirectory

"CodeAutomation2.iss"예제 파일을 시작 지점으로 사용하여 바로 가기 링크에서 작업 디렉토리를 읽습니다. 예제 파일의 IShellLink 코드는 내가 사용하고 있지만 "GetWorkingDirectory"를 사용하려고하면 다음과 같은 오류가 발생합니다. 다음은

Access violation

내가 사용하고있는 코드입니다. "GetWorkingDirectory"에서 내가 뭘 잘못하고 있니? 당신이 그것을 통과하기 전에

var 
    ShortcutFile: String; 

    WorkingDir: String; 
    Obj: IUnknown; 
    SL: IShellLinkW; 
    PF: IPersistFile; 

begin 
    { Create the main ShellLink COM Automation object } 
    Obj := CreateComObject(StringToGuid(CLSID_ShellLink)); 

    { Set the shortcut properties } 
    SL := IShellLinkW(Obj); 
    PF := IPersistFile(Obj); 

    NumFiles := 1 
    ShortcutFile := ExpandConstant('{#MyAppName}'); 

    Log('File is: ' + ExpandConstant('{group}') + '\' + ShortcutFile + '.lnk'); 
    OleCheck(PF.Load(ExpandConstant(ExpandConstant('{group}') + '\' + ShortcutFile + '.lnk'), 0)); 
    OleCheck(SL.GetWorkingDirectory(WorkingDir, 250)); 
    Log('WorkingDir: ' + WorkingDir); 

답변

2

당신은 WorkingDir 메모리를 할당해야합니다. 당신은 당신이 사용하는 공간의 250 개 문자를 할당하지만 실제로는 그렇게하지 않을 것을 IShellLinkW.GetWorkingDir 말 했어요.

SetLength(WorkingDir, 250); 
OleCheck(SL.GetWorkingDir(WorkingDir, 250)); 

더 좋은 해결책은 실제로 문자열의 끝 뒤에 여분 물건의 가능성을 제거하기 위해 반환 버퍼를 실제로 채우는 것일 수 있습니다. 첫번째 널 (null)와 (# 0) 문자를 미리 기입 한 후 GetWorkingDir는 왼쪽에서 웁니다 :

WorkingDir := StringOfChar(#0, 250); 
OleCheck(SL.GetWorkingDir(WorkingDir, 250); 
WorkingDir := Trim(WorkingDir); 
+0

너무 감사합니다! 경로 뒤에 원치 않는 문자를 모두 제거하는 방법에 대한 제안 사항이 있습니까? 경로를 가져 오는 중 문자열의 나머지 부분은 쓸모없는 문자로 채워집니다. – Mark

+1

@Ken : null 문자로 채우는 것이 트릭을 만들었습니다. TLama, Ken에게 감사드립니다. 매우 감사. 예,이 스레드를 정리해주십시오! 감사! – Mark