728x90

엑셀개체를 생성 후 프로세스가 종료되지 않고 작업관리자에 그대로 남아 있는 경우가 있을 것입니다.

틀림없이 워크북은 닫혔는데도  excel 자체는 종료하지 않고 남아 있는 경우가 있습니다.

엑셀개체가 종료되지 않아 자유게시판에도 질문을 드렸고 비슷한 내용의 글도 참고로 했지만 닫히지 않더군요

작업관리자에서 엑셀과 관련된 프로세서를 모두 종료시키는 코드를 api로 만들어서 하는 방법이 있지만 그것은 어떤 때는 문제를 일으키더군요

또한,워크시트를 닫은 후 워크북과 엑셀자체를 set ~ nothing 해주면 된다고 하던데 그것도 어떻게 코딩을 했느냐에 따라 다르더군요

자료와 도움을 주신분들의 글을 참고해서 몇 시간이 걸려서 해결했습니다.

엑셀개체가 종료안되는 이유는 의외로 간단한 곳에 있더군요

밑의 것을 실행했을 때 엑셀개체가 종료된다는 분도 있는데 저는 안되던데요


문제가 있는 부분을 파란색으로 다시 코딩하니 잘 되더군요

밑의 처럼 코딩하는 분들은 드물수 있지만 엑셀의 매크로 코드를 참고할 때는 가끔 실수를 할 때가 있으므로 한 번쯤 살펴보세요


대부분은 잘 아시는 부분이겠지만,모르시는 분들은 이런 경우가 있으면 참고하세요

너무나 생고생을 해서 찾은 것이라 두번 다시 이런 것으로 고생하는 분들이 없었으면 합니다.



set으로 정의한 것은 반드시 set으로 사용하고 set을 종료시켜주면 됩니다.

밑에서 파란색 부분을 잘 보면 아시겠지만,set로 정의해준대로 사용을 해야 됩니다.

엑셀에서 매크로 코드를 만들어서 vb에 다시 붙여넣어 사용하다 보면 어떤 부분은 set으로 정의해준대로 하지 않아도 정상적으로 작동하는 것을 볼 수 있습니다.

그래서 ActiveSheet.Name = "자료" 것처럼 set에서 정의해준 xlwb를 사용하지 않아도 작동은 합니다.

하지만,이런 것이 엑셀개체를 정상적으로 종료시켜주지 못하는 원인이 됩니다.

당연히 엑셀개체를 로드한 후므로 ActiveSheet.Name = "자료" 것을 사용하면 엑셀에서는 또다른 것을 생성한 것으로 인식하는 것 같습니다.

특히,차트의 제목 위치를 이동하는 부분에서 Selection.Left = 26을 그대로 사용하면 엑셀개체는 닫히지 않습니다.

이것도 set으로 정의해 준대로 하거나 제거를 해야합니다.


set으로 정의한 xlwb나 xlsh으로 코딩을 하지 않은 부분이 한 군데라도 있는지 찾아서 xlwb나 xlsh을 사용해서 코딩하는 것으로 바꾸면 해결됩니다.



Dim xl As Excel.Application

Dim xlwb As Excel.Workbook

Dim xlsh As Excel.Worksheet


On Error Resume Next ' 오류를 무시합니다.


Set xl = GetObject(, "Excel.Application") ' 실행된 엑셀이 있으면 가져온다


If Err.Number <> 0 Then ' Excel가 실행되고 있지 않았다면

Set xl = CreateObject("Excel.Application") ' Excel 객체를 로드한다.

ExcelWasNotRunning = True

End If


On Error GoTo 0 ' 정상적인 오류 처리


Set xlwb = xl.Workbooks.Add '// 워크북 하나를 추가한다.


Sheets.Add '기본양식 입력할 시트 추가(데이터 자료 입력할 시트)=>xlwb.Sheets.Add

ActiveSheet.Name = "자료" '/시트이름 변경=>xlwb.ActiveSheet.Name = "자료"


Set xlsh = xlwb.Sheets.Add '/ 시트를 하나 추가한다.(그래프 그릴 시트)

ActiveSheet.Name = "그래프" '/시트이름 변경=>xlwb.ActiveSheet.Name = "그래프"



'차트를 그릴 데이터 범위를 선택한다.


Sheets("그래프").Select '그래프 시트 선택=>xlwb.Sheets("그래프").Select

xlwb.Charts.Add '차트를 추가한다.

xlwb.ActiveChart.ChartType = xlLineMarkers '차트 종류

xlwb.ActiveChart.SetSourceData Source:=Sheets("데이터자료").Range("A" & i & ":" & colstr & i), PlotBy:=xlRows


xlwb.ActiveChart.Location Where:=xlLocationAsObject, Name:=xlsh.Name

xlwb.ActiveChart.ApplyDataLabels Type:=xlDataLabelsShowValue, LegendKey:=False


xlwb.ActiveChart.HasLegend = False


'차트 제목 입력부분

With xlwb.ActiveChart

 .HasTitle = True

     .ChartTitle.Characters.Text = grpstr(i)

     .ChartTitle.Select

     Selection.Left = 26 '차트 제목 위치=>Selection.Left = 26=>이런 경우도 엑셀개체가 종료가 안되는 원인입니다.(코딩을 안함? 다른 방법?)

     .Axes(xlValue).HasTitle = True

     .Axes(xlValue).AxisTitle.Characters.Text = "정보"


     With .Axes(xlCategory) 'x축 눈금선 조정

         .CrossesAt = 1

         .TickLabelSpacing = 1

         .TickMarkSpacing = 1

         .AxisBetweenCategories = True

         .ReversePlotOrder = False

     End With

   

   

     With .Axes(xlValue) 'y축 눈금선 조정

         .MinimumScale = 0

         .MaximumScale = sty

         .MajorUnit = 1

     End With


End With


xlwb.ActiveSheet.Shapes("Chart " & i).ScaleWidth linewidth, msofalse, msoScaleFromTopLeft '차트 크기

xlwb.ActiveSheet.Shapes("Chart " & i).IncrementLeft -99.6 '차트 왼쪽 위치

xlwb.ActiveSheet.Shapes("Chart " & i).IncrementTop i * y


'workbooks(1).saveas "c:\테스트.xls"=>이렇게 코딩하는 것도 엑셀개체를 정상적으로 닫히지 않게 하는 이유가 됩니다.(set으로 정의해준대로 코딩해야 합니다.)

xlwb.SaveAs "c:\테스트.xls"


xl.Quit

Set xlsh = Nothing

'xlwb.Close

Set xlwb = Nothing





Excel report하다보니.. 별일이 다 있더군뇨..
말씀하신데루 실행해두 어떤때는 되구 아니될때가 있더라구요...
아무래두 Excel의 문제점이 아닐지..
전 그냥 프로세스로 제거했는데 깔끔하더군뇨..

Public Sub Process_Kill(ByVal strXL As String)
Dim Xhwnd As Long
Dim HProcess As Long
Dim PID As Long
Dim TID As Long

Xhwnd = FindWindow("XLMAIN", "MicroSoft Excel - " & strXL & ".xls")

TID = GetWindowThreadProcessId(Xhwnd, PID)

HProcess = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, 0&, PID)

Call TerminateProcess(HProcess, 0&)
DoEvents
Call CloseHandle(HProcess)

End Sub






감사합니다.

아주 잘 종료되네요. ㅎㅎ

종료문제로 인하여 편법으로 엑셀개체를 재활용 하다가,

꼭 새개체를 사용해야하는 이유가 생겨서, 이 문제로 반나절을 고민했습니다.

Range 나 Activecell 들을 set 에 정의한 개체로 사용하지 않고 쓰면

종료가 안되네요.

다른분들은 제발 고생 안하셨으면.. ㅜㅜ

덧붙이자면... Selection 도 개체를 앞에 넣어주면 정상적으로 사용 가능하네요 ^^

'워드프로세스 > VBA' 카테고리의 다른 글

VBA 매크로를 Word 추가 기능으로  (0) 2008.12.16
VBA 매크로 코드사인(codesign)  (0) 2008.04.24
모질라/파이어폭스 XPI signing  (0) 2008.03.20
728x90

VB, VBA, Win32, ExcelReport 전문 개발카페입니다. 많은 관심 부탁드리여~~^^

http://cafe.naver.com/xlsvba



걍 혹시 VB루 엑셀 리포트 하실일 생기시믄 사용하시믄 어떨가하고 올립니다..
쓰레기 자료일거 같아 좀 머뭇거리다가 올려봅니다...
제 레베루 잘 아시겠지만 신임도 50%두 안되는 소스이니 잘 수정하셔서 올려주시믄 잘 배껴쓰겟습니다....
일부 문제점이 잇을수 있을거 같기두 하궁...
최소 5개 이상의 Child폼에서 사용한다는 가정하에 Public으루 맨들었으니..
두서너군데에서  사용된다면 Class Module에 놓구 사용하심이 조을듯 싶습니다...

Option Explicit

Private Const PROCESS_TERMINATE = &H1&
Private Const SYNCHRONIZE = &H100000
Private Const SW_HIDE = 0
Private Const SW_SHOWNORMAL = 1
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const Flags = SWP_NOMOVE Or SWP_NOSIZE
Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5

Private Declare Function GetTopWindow Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal HProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SearchTreeForFile Lib "imagehlp" (ByVal RootPath As String, ByVal InputPathName As String, ByVal OutputPathBuffer As String) As Long
Private Declare Function GetFullPathName Lib "kernel32" Alias "GetFullPathNameA" (ByVal lpFileName As String, ByVal nBufferLength As Long, ByVal lpBuffer As String, ByVal lpFilePart As String) As Long
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

Public XlApp As Object
Public XlWb As Object
Public Const XL_NOTRUNNING As Long = 429
Public Const XPath As String = "RPT시험위원문서양식"



'======================================================================================
' Function Name : GetXhwnd
' DateTime      : 2007-03-13 17:34
' Author        : 서은아빠 (foxmotor@nate.com)
' Purpose       : 해당 Excel파일의 핸들값을 구한다.
' Param         : strFN - 해당파일의 확장자와 Path를 제외한 이름
' Return        : GetXhwnd - 해당 Excel파일의 핸들값
'======================================================================================
Public Function GetXhwnd(ByVal strFN As String) As Long
   
   On Error GoTo GetXhwnd_Error

       GetXhwnd = FindWindow("XLMAIN", "Microsoft Excel - " & strFN & ".xls")

   On Error GoTo 0
   
   Exit Function

GetXhwnd_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure GetXhwnd of Module modExcel", , vbCritical
End Function


'============================================================================================
' Procedure     : Process_Kill
' Description   : API로 해당 엑셀프로세스 주겨버리기
' Author        : 서은아빠 (foxmotor@nate.com)
' Return        :
' Parameter     :strFN   : 저정한 엑셀윈도우의 캡션명(확장자를 제외한 파일명)
'============================================================================================
Public Sub Process_Kill(ByVal strFN As String)
Dim Chwnd      As Long
Dim HProcess  As Long
Dim PID           As Long
Dim TID           As Long

   On Error GoTo Process_Kill_Error

      Chwnd = GetXhwnd(strFN)
   
      TID = GetWindowThreadProcessId(Chwnd, PID)
   
      HProcess = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, 0&, PID)
   
      Call TerminateProcess(HProcess, 0&)
   
      Call CloseHandle(HProcess)

      On Error GoTo 0
       
      Exit Sub

Process_Kill_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure Process_Kill of Module modExcel", , vbCritical

End Sub



'======================================================================================
' Procedure : XReOpen
' DateTime  : 2007-03-13 17:46
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : 오픈된 엑셀을 재 오픈할시에 발생하는 오류를 사전에 차단
' Param     : strDpath - 해당파일의 FullName
'======================================================================================
Public Sub XReOpen(ByVal strDpath As String)
 Dim strFN As String
   On Error GoTo XReOpen_Error
       
       strFN = Mid(strDpath, InStrRev(strDpath, "", , vbTextCompare) + 1, _
       Len(strDpath) - InStrRev(strDpath, "", , vbTextCompare) - 4)

       If GetXhwnd(strFN) Then Call Process_Kill(strFN)
       
       Set XlApp = CreateObject("Excel.Application")
       
       With XlApp
           .WindowState = -4140        '## xlMinimized
           .Visible = True
           .EnableAnimations = False
           .workbooks.Open strDpath
       End With

   On Error GoTo 0
   
   Exit Sub

XReOpen_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure XReOpen of Module modExcel", , vbCritical
End Sub




'======================================================================================
' Procedure : XlSetCreate
' DateTime  : 2007-03-13 17:46
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : 엑셀 개체를 생성하고 새로운 워크북을 만들고 시트의 개수를 생성한다.
' Param     : intSht - 생성 시트개수
'             bState - 윈도우 상태설정 True - xlMaximized, False - xlMinimized
'======================================================================================
Public Sub XlSetCreate(ByVal intSht As Integer, Optional bState As Boolean = False)
 Dim lngState As Long
 
   On Error GoTo XlSetCreate_Error

       Set XlApp = CreateObject("Excel.Application")
       
       lngState = IIf(bState = True, -4137, -4140)
       With XlApp
           .WindowState = lngState
           .Visible = True
           .EnableAnimations = False
           .SheetsInNewWorkbook = IIf(intSht > 0, intSht, 1)
           Set XlWb = .workbooks.Add

       End With
       
   On Error GoTo 0
   
   Exit Sub

XlSetCreate_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure XlSetCreate of Module modExcel", , vbCritical
End Sub


'======================================================================================
' Procedure : XPreview
' DateTime  : 2007-03-13 17:58
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : Excel의 미리보기 창을 최상위 윈도우루 설정 - MDI폼을 BackGround루~~
' Param     : strFN - 해당파일의 확장자와 Path를 제외한 이름
'======================================================================================
Public Sub XPreview(ByVal strFN As String)
   
   On Error GoTo XPreview_Error

       SetWindowPos MDI폼.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, Flags
       
       SetWindowPos GetXhwnd(strFN), HWND_TOPMOST, 0, 0, 0, 0, Flags
       
       XlApp.WindowState = -4137
       
       XlApp.workbooks(strFN & ".xls").PrintPreview
       
       XlApp.WindowState = -4140
   
   Call Process_Kill(strFN)

   On Error GoTo 0
   
   Exit Sub

XPreview_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure XPreview of Module modExcel", , vbCritical
   
End Sub


'======================================================================================
' Procedure : XHighPos
' DateTime  : 2007-03-13 17:52
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : Excel의 미리보기 창을 최상위 윈도우루 설정
'======================================================================================
Public Sub MDIHighPos(Optional BLK As Boolean = True)
 Dim Top As Long
   On Error GoTo MDIHighPos_Error
       Top = IIf(BLK = True, HWND_TOPMOST, HWND_NOTOPMOST)
       SetWindowPos KMPMAIN.hwnd, Top, 0, 0, 0, 0, Flags

   On Error GoTo 0
   
   Exit Sub

MDIHighPos_Error:

   On Error GoTo 0
   MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure MDIHighPos of Module modExcel", , vbCritical
End Sub

'======================================================================================
' Procedure : GetXlfile
' DateTime  : 2007-03-15 03:31
' Author    : 서은아빠 (foxmotor@nate.com)
' Purpose   : 프로세스가 살아있는 Excel파일을 ListUp
'======================================================================================
Public Sub GetXlfile(ByVal frmN As Form)
   Dim Xhwnd    As Long
   Dim lngRet   As Long
   Dim lngSpace As Long
   Dim strSpace As String
   Dim strXname As String
   Dim Buf      As String * 255
   
   frmN.Show vbModeless
   
   frmN.cbXl.Clear
   
   Xhwnd = GetTopWindow(0)   '### 바탕화면 다음 윈도우를 얻는다.
   
   Do
   
   Xhwnd = GetNextWindow(Xhwnd, GW_HWNDNEXT)   '### 바탕화면 다음 윈도우를 얻는다.
   
   strSpace = Space(128)                                 '### 적당한 공간 할당하구
   
   lngRet = GetClassName(Xhwnd, strSpace, 128)           '### 클래스명을 얻었다믄(lngRet<>0) 공터에다가 클래스명 처넣구
   
   If lngRet Then strSpace = Left(strSpace, lngRet)      '### 클래스명을 얻었다믄(lngRet<>0) 빈문자열 삭제하구선
   
   If strSpace = "XLMAIN" Then                           '### Excel 윈도우라면...
       
       lngSpace = GetWindowTextLength(Xhwnd)             '### 캡션 길이 구하구
       
       strXname = Space(lngSpace)                        '### 변수에 공간 할당
       
       Call GetWindowText(Xhwnd, strXname, lngSpace + 1) '### 숨기구나 보여주거나
       
       strXname = Mid(strXname, 19, Len(strXname)) ' & ".xls"
       
       frmN.cbXl.AddItem strXname
       
   End If                                                '### 아님 말구
   
   Loop While Xhwnd                                      '### 핸들값 존재하믄 계속 지루박 돌구
   
   frmN.cbXl.ListIndex = 0

End Sub 설문투표

728x90
((( 준비작업 )))

A. 인증서 신청은
  Netscape Object Signing 인증서를 신청
 또는
  Microsoft Authenticode로 받은 인증서를 Netscape로 변환하여 사용

(일반적으로 사용가능한 Microsoft Authenticode 를 받는 편이 유리)

B. pvkimprt 를 통해 받은 spc , pvk 파일을 레지스트리로 import 시킨다.
pvkimprt 다운로드 : http://www.certkorea.co.kr/pds/pvkimprt.exe


   > pvkimprt -import nine4u.spc nine4u.pvk
   a. 비밀번호를 물어보는 창에서 개인키 비밀번호를 입력한다.
   b. 다음
   c. 인증서 종류 기준으로 인증서 저장소를 자동으로 선택 (default) 에 체크 -> 다음
   d. 마침.
   e. 이상으로 레지스트리에 인증서가 import 된다.
   확인: IE(브라우저) 에서 도구>인터넷옵션>내용>인증서 에서 개인탭을 보시면 발급대상에 추가된 인증서 확인가능


C. 인증서에 이름 부여
  a. IE 의 도구 > 인터넷 옵션 > 내용 > 인증서
  b. 인증서 선택
  c. 보기 > 자세히 > 속성편집
  d. 이름입력 후 확인 (예) nine4uCodeSign


D. pvkimprt 를 통해 pfx 파일로 export 시킨다.
   > pvkimprt -pfx nine4u.spc nine4u.pvk
   a. 비밀번호를 물어보는 창에서 개인키 비밀번호를 입력한다.
   b. 다음
   c. 예, 개인키를 내보냅니다. (default) 에 체크 -> 다음
   d. 가능하면 인증 경로에 있는 인증서 모두 포함 (체크)
      그외 체크 모두 없애고 다음
   e. 암호 , 암호확인 입력 후 다음
   f. 파일이름은 저장할 pfx 파일 이름을 입력합니다. (예: nine4u.pfx) 다음.
   g. 마침.


(참고) http://www.certkorea.co.kr/doc.asp?g_dev_conv


((( 코드사인 시작~~ )))

-------
다음은 윈도우 플랫폼에서 Firefox 플러그인 코드사인 방법입니다.

1. Mozilla FTP 사이트에서 최신의 Network Security Services (NSS) 패키지를 다운 받습니다. :
ftp://ftp.mozilla.org/pub/mozilla.org/security/nss/releases/
윈도우 사용자는 NSS_3_9_RTM/WINNT5.0_OPT.OBJ/ 에서 nss-3.9.zip 을 받습니다.


2. 원하시는 곳에 압축을 풉니다. 예)  C:\Apps\nss-3.9\


3. Mozilla FTP 사이트에서 최신의 Netscape Portable Runtime 을 다운 받습니다. 
http://ftp.mozilla.org/pub/mozilla.org/nspr/releases/
윈도우 사용자는 v4.6/WINNT5.0_OPT.OBJ/ 에서 nspr-4.6.zip 을 받습니다.


4. 압축을 풉니다.  예) C:\Apps\nspr-4.6\


5.  NSS 의 bin , lib, nspr 의 lib 를 시스템 path 에 추가합니다.
   제어판 > 시스템 속성 > 고급 > 환경변수 > 시스템변수 에 추가하거나,
   또는 실행시 마다 설정 하실 수 있습니다.

   윈도우의 경우 몇몇 파일들 (예로, certutil.exe) 은 \widnows\system32\ 에 이미 포함되어 있으니,
   새로 추가된 파일들이 실행되도록 하기 위해 추가될 경로는 기존의 path 앞에 위치 시킵니다.

  설정 예)
          C:\> set PATH=C:\Apps\nss-3.9\bin\;C:\Apps\nss-3.9\lib\;C:\Apps\nspr-4.6\lib\;%PATH%


6. NSS 툴 문서 함 읽어 보시고~ (패스 )


7. 인증서 DB 초기화
  인증서 DB 파일을 위치시킬 폴더를 결정합니다. 다음 명령으로 DB 파일을 생성합니다. ( -d 옵션뒤에 . (마침표) 있음)


  Code:
       C:\Projects\CodeSigning\> certutil -N -d .
  => 현재디렉토리에 인증서 DB 파일을 새로 생성 한다.

  다음 내용과 같이 NSS Certificate database 의 password 를 물어 봅니다.
  (중요) 절대 잊어 버리면 안됩니다.
  뒤에도 비번이 나오는데 NSS 인증서 DB 비번과 , 인증서의 개인키 비번은 별개 입니다. 혼동주의!

   Code:
C:\Projects\CodeSigning\> certutil -N -d .
Enter a password which will be used to encrypt your keys.
The password should be at least 8 characters long,
and should contain at least one non-alphabetic character.

Enter new password:
Re-enter password:


이후 dir 해보시면
cert8.db , key3.db , secmod.db 파일 3개가 생성되어 있음을 확인 할 수 있습니다.


8. 위에서 준비한 pfx 파일을 NSS cert DB 에 import 시킵니다.

Code:
C:\Projects\CodeSigning> pk12util -i "nine4uCodeSign" -d .
Enter Password or Pin for "NSS Certificate DB":  <- 7번 단계에서 입력한 비밀번호
Enter password for PKCS12 file:                  <- 인증서 개인키 비밀번호
pk12util: PKCS12 IMPORT SUCCESSFUL
; nine4uCodeSign 은 위의 C 단계에서 지정한 인증서 이름입니다.


; 다음 명령으로 인증서가 추가된 것을 확인 하실 수 있습니다.
C:\Projects\CodeSigning> certutil -L -d .
nine4uCodeSign                                               u,u,u
Thawte Code Signing CA - Thawte Consulting cc                c,,c



9. 싸인을 위한 XPI 파일을 준비 합니다.

 새로운 폴더를 하나 생성하고 XPI 파일을 생성된 폴더에 카피 후 경로를 포함하여 압축을 풉니다.
 XPI 파일은 삭제하고 NSS DB 폴더로 돌아갑니다.

(주의) xpi zip 파일내의 파일 순서를 지켜줘야 합니다.
       첫번째 파일은 META-INF/zigbert.rsa 파일이 되어야 합니다.
       순서정렬이 가능한 zip 유틸을 사용하셔야 합니다.

Code:
C:\Projects\CodeSigning\> md signed

C:\Projects\CodeSigning\> copy C:\Projects\fsb\fsb.xpi signed
        1 file(s) copied.

C:\Projects\CodeSigning\> cd signed

C:\Projects\CodeSigning\signed> unzip fsb.xpi
Archive:  fsb.xpi
   creating: chrome/
  inflating: chrome.manifest
  inflating: chrome/fsb.jar
  inflating: install.rdf

C:\Projects\CodeSigning\signed> del fsb.xpi

C:\Projects\CodeSigning\signed> cd ..


10. 싸인 합니다.

Code:
C:\Projects\CodeSigning\> signtool -d . -k nine4uCodeSign -p "NSS패스워드" signed/
using certificate directory: .
Generating signed//META-INF/manifest.mf file..
--> chrome/fsb.jar
--> chrome.manifest
--> install.rdf
Generating zigbert.sf file..
tree "signed/" signed successfully

11. XPI 로 다시 패키징 합니다.

signed 폴더로 가서 META-INF/zigbert.rsa 파일을 처음에 오도록 zip 합니다.

Code:
C:\Projects\Certs\> cd signed

C:\Projects\CodeSigning\signed\> zip fsb.xpi META-INF/zigbert.rsa
  adding: META-INF/zigbert.rsa (deflated 35%)

C:\Projects\CodeSigning\signed> zip -r -D fsb.xpi * -x META-INF/zigbert.rsa
  adding: META-INF/manifest.mf (deflated 37%)
  adding: META-INF/zigbert.sf (deflated 40%)
  adding: chrome/fsb.jar (deflated 74%)
  adding: chrome.manifest (deflated 69%)
  adding: install.rdf (deflated 62%)

12. 완료.


인증서 신청  :  THAWTE : www.certkorea.co.kr,  VERISIGN : www.ssl.co.kr

+ Recent posts