2012-12-14 4 views
1

안녕하세요 저는 "visma"라고하는 다른 프로그램에 의존하는 프로그램의 설치 프로그램을 만드는 중입니다. 사용자가 설치 경로를 선택할 때 단순히하고 싶습니다.경로에서 값을 가져 오는 윅스

사용자가 visma를 설치 한 경로를 두 개 더 지정해야한다는 점. 그리고 나서 그 입력을 txt 파일이나 다른 것으로 읽어 들이고 싶습니다. 나중에 프로그램 외부에서 경로를 읽고 비자에서 필요한 일부 파일을 복사 할 수 있습니다.

enter image description here

이 내가 작품을 설치 UI에서 가지고 얼마나 멀리하고 수행의 작업

하지만 난 세 개의 필드를 얻을 기본 경로를 변경하는 데 필요한 디렉토리 변수를 만드는 방법을 잘 모릅니다 그림에서

MYInstalldirdlg

*

,691 당신이

WixUI_MYInstallDir

*

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Fragment> 
    <UI Id="WixUI_MYInstallDir"> 
     <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" /> 
     <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" /> 
     <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" /> 

     <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" /> 
     <Property Id="WixUI_Mode" Value="InstallDir" /> 

     <DialogRef Id="BrowseDlg" /> 
     <DialogRef Id="DiskCostDlg" /> 
     <DialogRef Id="ErrorDlg" /> 
     <DialogRef Id="FatalError" /> 
     <DialogRef Id="FilesInUse" /> 
     <DialogRef Id="MsiRMFilesInUse" /> 
     <DialogRef Id="PrepareDlg" /> 
     <DialogRef Id="ProgressDlg" /> 
     <DialogRef Id="ResumeDlg" /> 
     <DialogRef Id="UserExit" /> 

     <Publish Dialog="BrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish> 
     <Publish Dialog="BrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish> 

     <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish> 

     <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish> 
     <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish> 

     <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish> 
     <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="MYInstallDirDlg">LicenseAccepted = "1"</Publish> 

     <Publish Dialog="MYInstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="ChangeFolder1" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish> 
     <Publish Dialog="MYInstallDirDlg" Control="ChangeFolder1" Event="SpawnDialog" Value="BrowseDlg" Order="2">1</Publish> 

     <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MYInstallDirDlg" Order="1">NOT Installed</Publish> 
     <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish> 
     <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="2">Installed AND PATCH</Publish> 

     <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish> 

     <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
     <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
     <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish> 

     <Property Id="ARPNOMODIFY" Value="1" /> 
    </UI> 

    <UIRef Id="WixUI_MYCommon" /> 
</Fragment> 

012,351,641 그들은 모두 그들이 내 디렉토리 WIXUI_INSTALLDIR에서 얻을 동일한 경로를 보는 바와 같이
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Fragment> 
    <UI> 
     <Dialog Id="MYInstallDirDlg" Width="370" Height="270" Title="!(loc.InstallDirDlg_Title)"> 
      <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" /> 
      <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" /> 
      <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)"> 
       <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish> 
      </Control> 

      <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="Choose default or your own folder for install and specify visma folders" /> 
      <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="{\WixUI_Font_Title}Destination Folders" /> 
      <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.InstallDirDlgBannerBitmap)" /> 
      <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" /> 
      <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" /> 


      <Control Id="FolderLabel1" Type="Text" X="20" Y="50" Width="290" Height="12" NoPrefix="yes" Text="!(loc.InstallDirDlgFolderLabel)" /> 
      <Control Id="Folder1" Type="PathEdit" X="20" Y="65" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" /> 
      <Control Id="ChangeFolder1" Type="PushButton" X="20" Y="85" Width="56" Height="15" Text="!(loc.InstallDirDlgChange)" /> 

      <Control Id="FolderLabel2" Type="Text" X="20" Y="110" Width="290" Height="12" NoPrefix="yes" Text="Please specify where your Visma Administration installation folder is:" /> 
      <Control Id="Folder2" Type="PathEdit" X="20" Y="125" Hidden ="no" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" /> 
      <Control Id="ChangeFolder2" Type="Text" X="20" Y="150" Width="56" Height="18" Text="Change..." /> 

      <Control Id="FolderLabel3" Type="Text" X="20" Y="175" Width="290" Height="22" NoPrefix="yes" Text="Please specify where your SPCS folder is which contains (Företag) and (Gemensamma filer):" /> 
      <Control Id="Folder3" Type="PathEdit" X="20" Y="195" Hidden ="no" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" /> 
      <Control Id="ChangeFolder3" Type="Text" X="20" Y="215" Width="56" Height="18" Text="Change..." /> 
     </Dialog> 
    </UI> 
</Fragment> 

여기

나는 단지 그것을 작동하게하는 데 필요한 변경 한 : 이름이 *

<!-- Directory 1 (install folder) --> 
<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="ProgramFilesFolder"> 
    <Directory Id="INSTALLDIR" Name="ITC_Venato" > 
    </Directory> 
      //componet stuff and files to install 
    </Directory> 
</Directory> 

<Feature 
    Id="Venato_Windows_Service_0.904" 
    Title="Venato Windows Service" 
    Level="1"> 
    <ComponentRef Id="Venatoexe" /> 
</Feature> 

<!-- Include a user interface--> 
<Property Id="WIXUI_INSTALLDIR">INSTALLDIR</Property> 
<UIRef Id="WixUI_MYInstallDir" /> 
<UIRef Id="WixUI_ErrorProgressText" /> 

은 관련 부분하지만 난을 포함

제품

일치 있도록 WixUI_MYInstallDir 변경 등 주문에 윅스와 제품 태그가 있지만 나는 내가 원하는 새 폴더 ID로 새 속성 ID를 만들어야한다고 생각합니다.

하지만 프로그램에서 경로를 읽고 텍스트 파일이나 읽을 수있는 변수로 보내려면 어떻게해야합니까? 설치 경로와 마찬가지로 새 폴더를 만드는 프로그램을 원하지 않습니다. 비자는 visma가 있고 읽히는 사용자에 의해 선택되어야합니다.

답변 해 주셔서 감사합니다.

*

*

*

*

오류

enter image description here

답변

1

를 사용하여 서로 다른 속성을 언급처럼 :

<Property Id="WIXUI_INSTALLDIR">INSTALLDIR</Property> 
<Property Id="VISMA_ADMIN" Secure="yes"></Property> 
<Property Id="SPCS_FOLDER">INSTALLDIR</Property> 

<Control Id="FolderLabel2" Type="Text" X="20" Y="110" Width="290" Height="12" NoPrefix="yes" Text="Please specify where your Visma Administration installation folder is:" /> 
<Control Id="Folder2" Type="PathEdit" X="20" Y="125" Hidden ="no" Width="320" Height="18" Property="VISMA_ADMIN" Indirect="yes" /> 
<Control Id="ChangeFolder2" Type="Text" X="20" Y="150" Width="56" Height="18" Text="Change..." /> 

<Control Id="FolderLabel3" Type="Text" X="20" Y="175" Width="290" Height="22" NoPrefix="yes" Text="Please specify where your SPCS folder is which contains (Företag) and (Gemensamma filer):" /> 
<Control Id="Folder3" Type="PathEdit" X="20" Y="195" Hidden ="no" Width="320" Height="18" Property="SPCS_FOLDER" Indirect="yes" /> 
<Control Id="ChangeFolder3" Type="Text" X="20" Y="215" Width="56" Height="18" Text="Change..." /> 

텍스트 파일에 저장하려는 경우 사용자 지정 동작을 사용합니다. 데이터를 텍스트 파일에 저장하는 방법에 대한 코드를 작성합니다.

hr = WcaGetProperty(L"INSTALLDIR",&szInstallDir); 
ExitOnFailure(hr, "failed to get install location"); 

wcstombs(szLocation, szValueBuf, 260); 
strcat(szLocation, "\\NameOfTextFile.txt"); 


CString lpszString = CString("Visma Admin:") + szVismaAdmin + "\r\n"; 

hr = AppendInfo(szLocation,lpszString); 
ExitOnFailure(hr, "failed to append the NameOfTextFile.txt file with the 

LExit: 
ReleaseStr(szValueBuf); 
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; 
return WcaFinalize(er); 
} 

그리고 도우미 함수 :

HRESULT AppendInfo(__in LPCSTR lpszFile, __in LPCSTR lpszEntry) 
{ 
HRESULT hr = S_OK; 
HANDLE hFile; 
DWORD dwWritten; 
CHAR szError[MAX_PATH*2]; 
CHAR szTitle[MAX_PATH]; 

try 
{ 
    if ((hFile = CreateFile(lpszFile, 
     GENERIC_READ|GENERIC_WRITE, 
     FILE_SHARE_READ | FILE_SHARE_WRITE, 
     NULL, 
     OPEN_EXISTING, 
     FILE_ATTRIBUTE_NORMAL, 
     NULL)) == INVALID_HANDLE_VALUE) 
    { 
     // Error: Couldn't Open File. Handle error 

    } 

    // No Entry Exists. 
    SetFilePointer(hFile, 0, NULL, FILE_END); 

    if (!WriteFile(hFile,lpszEntry,lstrlen(lpszEntry),&dwWritten,NULL)) 
    { 
     CloseHandle(hFile); 
     //HandleError 
    } 

    CloseHandle(hFile); 
} 
catch(int e) 
{ 
    // A failure caused an exception! 
    //Handle Error 
} 

return hr; 
} 

편집 :

extern "C" UINT __stdcall GetLoggersInfo(MSIHANDLE hInstall) 
{ 
HRESULT hr = S_OK; 
UINT er = ERROR_SUCCESS; 
char szLocation[MAX_PATH]; 
LPWSTR szValueBuf = NULL, szInstallDir = NULL, szVismaAdmin = NULL; 

hr = WcaInitialize(hInstall, "GetLoggersInfo"); 
ExitOnFailure(hr, "Failed to initialize"); 

WcaLog(LOGMSG_STANDARD, "Initialized."); 

hr = WcaGetProperty(L"VISMA_ADMIN",&szVismaAdmin); 
ExitOnFailure(hr, "failed to get folder"); 

hr = WcaGetProperty(L"SPCS_FOLDER",&szValueBuf); 
ExitOnFailure(hr, "failed to get folder"); 

난 당신이 그래서에서 디렉토리를 얻을 제품과 함께 텍스트 파일을 설치하는 가정입니다 깜빡 사용자 지정 작업을 추가하고 일정 예약 후 언급하십시오. InstallFinalize

+0

감사합니다 :) 프로젝트에 디렉토리를 만들어야합니까? 아니면 기본 맵을 표시하는 것입니까? 내가 처음으로 코드 – Dendei

+1

의 변경 사항을 편집하면 이해할 수 없다는 오류가 있습니다. 오류가 발생하면 해당 속성이 연결된 대화 상자가 필요합니다. 정확히 무엇이 잘못되었는지 확인하는 좋은 방법은 자세한 로그입니다. 이 두 웹 사이트가 도움이 될 것입니다. http://wix.sourceforge.net/manual-wix3/get_a_log.htm, http://msdn.microsoft.com/en-us/library/windows/desktop/aa372835%28v=vs.85%29.aspx –

+0

정말 고맙습니다. 나는 그것을 조사 할 것이다. – Dendei

관련 문제