2010-03-01 3 views
1

(C에서) 개발중인 응용 프로그램에서 기본 응용 프로그램이 실행되기 전에 먼저 로더 응용 프로그램을 실행해야합니다. 이 작업을 자동화하기 위해 주 앱이 실행될 때 하위 애플리케이션으로 로더 앱을 실행하도록 만들었습니다. 이 모든 기능은 잘 작동합니다. 단, 로더 앱은 기본 앱이 올바르게 작동하기 위해 사용자의 현재 로그인 세션 중 한 번만 실행하면되며 기본 앱이 실행될 때마다 실행해야하므로 고통. 그래서 내가 묻는 것은 : 로더가 이미 일부 Windows 또는 C 기능을 사용하여 실행되었는지 확인하는 방법이 있습니까? 주요 응용 프로그램은 로더가 실행될 때 플래그 역할을하는 더미 파일을 만들 수있는 같이현재 로그인 세션 중에 이미 프로그램이 실행되었는지 어떻게 확인합니까? (Windows)

if(thisapp.exe hasBeenExecuted) 
    return; 
else 
    spawnl(app_path, app_name, args, NULL); 

아니면 뭔가 : 나는 그것도 가능하면 아무 생각이 없음에도 불구하고이 같은 이상적으로 뭔가, 좋은 것입니다. 그런 다음 후속 실행시 파일이 있는지 확인하고 그렇지 않은 경우 로더를 실행하십시오. 이 문제는 컴퓨터를 끌 때 더미 파일이 지워지도록 자동화하는 것이 유일한 문제입니다 (이 방법이 있습니까?).

설명 : 기본 앱에서 로더 앱을 편집하거나 기능을 복제 할 수 없으므로 작성하지 않았습니다.

미리 도움 주셔서 감사합니다.

답변

1

또한 읽을 필요없이 원자 기능을 사용할 수 있습니다 /이 필요로 의미 할 로더 응용 프로그램은, 먼저 실행해야 할 무엇 거대한 파일

http://msdn.microsoft.com/en-us/library/ms649053%28VS.85%29.aspx

+0

, 감사합니다! 이 기능은 Windows XP에서는 잘 작동하지만 다른 Windows 배포판에서 기능이 전혀 변경되지 않았다는 것을 알고 있습니까? –

+0

나는 win32 자료가 NT에서 위쪽으로 같을 것이라고 추측 할 수 있습니다. Win 3.x로 돌아가는 모든 원자재가 있었지만 다른 매개 변수가 있는지 없는지는 기억이 안납니다. 사용해보기 (여전히 XP에서 작동해야 함) http://ghirai.com/hutch/files/win32hlp_big.zip –

2

몇 가지 방법이 있습니다.

응용 프로그램이 Run key에 항목을 추가 할 수 있습니다. 따라서 사용자가 로그온 할 때 적어도 세션 당 한 번 실행하는 것이 보장됩니다. 이 경우 특별한 명령 행 인수를 전달하여 재발행과 구별 할 수 있습니다.

다른 옵션은 현재 사용자 하이브에 상태를 저장하고 REG_OPTION_VOLATILE 플래그로 키를 생성하는 것입니다. 이로 인해 키가 메모리에만 저장되고 하이브가 언로드 될 때 디스크로 플러시되지 않습니다. 하이브가 언로드되면 사용자가 로그 오프 할 때와 동일해야합니다.

0

내가 과거에 사용한 적이있는 한 가지 제안은 파일을 삭제하거나 (또는 ​​교대로 생성하는) 사용자 - 하이브 (예 : 레지스트리)에서 응용 프로그램을 실행하는 것입니다. 이점은 시작 (또는 사용자가 연결하는 위치에 따라 사용자 프로파일로드) 중에 실행되며 대부분의 경우 한 번만 실행해야하는 쉘 스크립트 (배치 파일)처럼 간단 할 수 있다는 것입니다 (시작시 또는 사용자 로그인시).). 로그인을 선택하면 사용자가 로그 아웃 한 후 사용자가 컴퓨터에 로그인 할 때마다 로그인이 실행됩니다.

당신은 사용자에 그것을 할 하이브 언로드 할 때 당신은 항상 기계의 상태를 알 수 없기 때문에이 다소 덜 신뢰할 수 있지만,뿐만 아니라 로그 아웃 할 수있다 (이 등, 전원에서 추락 할 수있다).

실용적인 증거는 아니지만 대부분의 정상적인 사용 시나리오에서는 작동 할 것입니다.

다른 트릭으로 파일에 타임 스탬프를 쓸 수 있으며로드 할 때 타임 스탬프를 가져 와서 현재 사용자가 로그온 한 시간보다 작은 지 확인합니다. 그런 경우 현재 사용자 세션 중에 발생할 가능성이있는로드를 건너 뛸 수 있습니다.

이 경우에도 몇 가지 단점이 있지만 정상적으로 작동해야합니다.

0

쓰기?

옳은 대답은 확인 된 것인가를 확인하고 실제로 완료되었는지 확인하는 것입니다. 다른 것은 깨지기 쉽고 구석 구석에서 깨질 수 있습니다.

0

이전에 뮤텍스를 사용하여 구현했습니다. 예를 들어

: 이것은 완벽하게 작동

int main(int argc, char argv[][]) 
{ 
    // if Mutex exists 
    // { 
    //  Don't allow a second instance to run: 
    //  Notify user, log something, etc. 
    //  return 0; 
    // } 
    // else 
    // { 
    //  Create Mutex, this is the first time running 
    // } 

    // Rest of your program runs from here . . . 
} 

-bn

관련 문제