2011-09-03 4 views
3

VB6 응용 프로그램이 있고 설치 프로그램이 INNO 설치를 사용하여 컴파일됩니다. 설치 프로그램이 올바르게 실행됩니다. 그러나 사용자가 아이콘을 클릭하여 설치된 앱을 실행하면 약 10 %의 컴퓨터에서 오류 메시지가 나타나지 않고 경고음 만 울립니다.VB6 응용 프로그램이 일부 컴퓨터에서는 실행되지 않고 다른 컴퓨터에서는 제대로 실행됩니다.

이것은 XP에 일어나고 또한 내가 XP 및 Windows 7의 개발 7.

승리와 응용 프로그램이 작동 확인, 그래서 문제를 재현하지 못하고있다.

설치 프로그램이 필요한 모든 ocx 및 dll을 등록합니다 (afaik). (글쎄, 완전히 모든 그것은 MS 런타임 구성 요소가 있어야한다고 가정하지만 뭔가가없는 경우 오류 메시지가 나타나야합니다)

나는 사용자 권한, UAC 같은 종류의 생각하고 있었지만 사용자도 관리 그룹에 문제가 있습니다.

앱을 패치하기 위해 찾아서 테스트 할 수있는 가능한 문제점을 지적 해주세요.

감사합니다.

선단에

감사 [후속, 매니페스트는 문제를 일으키는 알았다. 지금은 이유를 발견하기 위해 노력하고있어

http://www.vbaccelerator.com/home/vb/code/libraries/xp_visual_styles/using_xp_visual_styles_in_vb/article.asp

: 내가 더 잘 컨트롤을 만들기 위해 그것을 사용할 수 있습니다. 동일한 매니페스트가있는 다른 응용 프로그램이 있는데 그 중 하나가 정상적으로 작동합니다.

아직 이벤트 표시기에 대한 피드백을 얻을 수 없었습니다.

+0

모든 의존 물이 대상 컴퓨터에 있는지 확인해야합니다. 이벤트 뷰어를보고 오류가 기록되었는지 확인해 보셨습니까? 전에 MCI ocx에 문제가있었습니다. –

+0

응용 프로그램이 ActiveX EXE입니까? – wqw

+0

wqw : 아니요, ActiveX Exe가 아닙니다. – Sunjen

답변

3

"경고음 오류"는 종종 XML 구문 오류 또는 namspace 충돌과 같은 응용 프로그램 목록의 오류를 나타냅니다. 이벤트 로그는 종종 이에 대한 힌트를 제공합니다.

그러나 사람들은 종종 적절한 라이브러리로드 순서를 보장하지 않고 Common Controls 6.0 Library를 사용하려고합니다.

모든 양식이 openend되기 전에 shell32를로드 한 다음 comctl32를로드해야합니다. 가장 쉬운 방법은 하위 홈페이지에서 무 조작 호출의 커플입니다 : 일반적 Vista 또는 Win7에에서 잘 작동이 프로그램없이

Option Explicit 

Private Declare Sub InitCommonControls Lib "comctl32"() 

Private Declare Function IsUserAnAdmin Lib "shell32"() As Long 

Private Sub InitCommonControlsVB() 
    IsUserAnAdmin 
    InitCommonControls 
End Sub 

Private Sub Main() 
    InitCommonControlsVB 
    Form1.Show 
End Sub 

있지만, 일부 XP 서비스 팩 및 패치 수준에 실패합니다. 이것의 일부는 SxS 활성화 및 comctl32.dll 패치를 처리하는 Fusion 서브 시스템의 시간에 따른 변화 때문입니다.

InitCommonControlsEx()를 호출해야한다는 것을 무시하면 VB6 및 COM 컨트롤 대신 Win32 컨트롤을 직접 구성하고 사용하지 않는 한 필요하지 않습니다.

+0

흠 ... 당신은 매니 페스트 XML에 대해 생각하고있어. 클라이언트에게 "app.exe.manifest"파일의 이름을 바꾸고 결과를 기다리면서 시도 : – Sunjen

+0

예 "app.exe.manifest"파일의 이름을 바꾸거나 삭제 한 후 다시 작동합니다! 디버깅 .. – Sunjen

2

몇 가지를 좁힐 시도 : 충돌 이벤트에 대한

확인 Windows 이벤트 로그를

에서 충돌 보고서합니다 (응용 프로그램 섹션에서) Windows 이벤트 로그를 확인하여 신청. 시작을 실행하고 eventvwr을 입력하고 을 입력하여 Windows XP의 로그 뷰어에 빨리 도달 할 수 있습니다.을 입력하십시오. Windows 7에서는 시작 메뉴의 검색 상자에 "이벤트 표시기"를 입력 할 수 있습니다. 프로그램에서 오류 이벤트 만 표시하도록 이벤트를 필터링 할 수 있습니다.

이러한 컴퓨터에서 오류보고 기능이 꺼져있는 것처럼 들릴 수 있으므로이 문제가 이미 발생한 컴퓨터 중 하나에서 몇 가지 오류 이벤트를 찾을 수 있습니다.이 경우에는 액세스 위반과 같은 "하드 충돌"이 기록됩니다 디버거가 컴퓨터에 설치되어 있지 않으면 최종 사용자에게 오류 대화 상자를 표시하는 대신 이벤트 로그에 표시됩니다. 앞의 절에서 언급 한 바와 같이

확인 "오류보고"를 확인은 OS 레벨에서

돌리면,이 기능을보고 오류가 이러한 컴퓨터에 꺼져처럼 들린다. 이 경우 크래시가 최종 사용자에게 어떤 종류의 메시지도 표시하지 않으며 응용 프로그램이 갑자기 사라집니다.Windows XP의 경우,이 설정을 확인할 수 있습니다 (전원을 켭니다) 다음과 같이

  1. "내 컴퓨터"를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다.
  2. 고급 탭을 열고 오류보고 버튼을 클릭하십시오.
  3. 오류보고 사용 옵션을 선택하십시오.
  4. 열려있는 모든 창에을 입력하십시오. 을 입력하십시오. 또한 메시지 상자를 표시하거나 Windows 이벤트 로그에 메시지를 작성하는 등의 코드로, 응용 프로그램의 시작 코드에 약간의 추적 코드를 추가 할 수

    응용 프로그램에

추가 추적 코드 또는 응용 프로그램이 시작 되 자마자 로그 파일 (예를 들어, 기본 양식의 Form_Initialize 이벤트 또는 Sub Main 루틴)에서 로그 파일에 저장됩니다.

VB6 런타임 이전 또는 이후에 응용 프로그램이 충돌하는지 여부를 알 수 있습니다. 응용 프로그램을 시작하려고 할 때 응용 프로그램이 사라지고/충돌이 발생하고 시작 메시지가 기록되지 않으면 VB6 런타임이나 VB6 런타임 자체의 종속성이 제대로 설치되지 않았 음을 나타낼 수있는 응용 프로그램의 시작 코드에 도달하기도 전에 충돌이 발생한다는 것을 알고 있어야합니다.

Windows XP 및 Windows 7은 모두 VB6 런타임이 사전 설치되어 제공되지만 설치 관리자가 오작동하여 VB6 런타임에 포함 된 파일을 덮어 쓰거나 제거 할 수 있습니다.

+2

또한 "On Error Resume Next"문을 코드에 넣은 경우 지금 주석으로 처리합니다. 그들은 당신에게서 모든 유용한 오류 정보를 숨길 수있는 불쾌한 방법을 가지고 있습니다. – feathj

+0

@jonfen : 전화하세요. 그것은 내 마음을 완전히 미끄러 뜨 렸습니다. –

+0

위대한, 귀하의 조언을 체크 – Sunjen

관련 문제