Your checks for an empty string are wrong - constructs like ip == L""
need to be *ip == 0 or similar. Check the documentation for the sprintf() implementation you're using. In Standard C %s is for a normal character string but you're using it for wide character strings - that would explain an IP address starting with a 1 getting printed as just a single "1". Microsoft's implementation does weird things under some circumstances, you need to be using whatever is appropriate for a wide string here. You're getting "ipaddress" and spaces in the output because that's what you told it to put there. Regards, jjf On 13/03/2015 17:40, Sarvagya Pant wrote: > I have written a C# Custom Action that is supposed to get the Values of > Properties passed to the installer and create some config file. Since the > C# Custom action was done, my installer depends upon .Net too. I want to > avoid this dependency, thus I am opting to write the Custom action in C++. > > Following is the C# code that I'm trying to convert in C++: > > session.Log("Entering WriteFileToDisk");string ipAddress = > session["IPADDRESS"];string productCode = > session["ProductCode"];string config_path = > "C:\\SomeFolderToInstall\\";string compression = > session["COMPRESSION"];string ssl = session["SSL"];if > (string.IsNullOrEmpty(compression)){ > compression = "True"; //default true}if (string.IsNullOrEmpty(ssl)){ > ssl = "False"; //default false}if (string.IsNullOrEmpty(ipAddress)){ > ipAddress = "127.0.0.1";}string temp = @" > {{ > ""logpoint_ip"" : ""{0}"", > ""compression"" : ""{1}"", > ""ssl"": ""{2}"" > }}";string filePath = > "C:\\SomeFolderToInstall\\lpa.config";System.IO.FileInfo file = new > System.IO.FileInfo(filePath); > file.Directory.Create(); // If the directory already exists, this > method does nothing.System.IO.File.WriteAllText(file.FullName, > config);System.IO.File.WriteAllText(config_path + "productcode.txt", > productCode); > session.Log("Confile file is written"); > session.Log("Product Code file is written");return ActionResult.Success; > > The Visual C++ code is given below: > > #include "stdafx.h" > > > UINT __stdcall WriteFileToDisk(MSIHANDLE hInstall){ > HRESULT hr = S_OK; > UINT er = ERROR_SUCCESS; > > hr = WcaInitialize(hInstall, "WriteFileToDisk"); > ExitOnFailure(hr, "Failed to initialize"); > > LPWSTR ip = NULL; > hr = WcaGetProperty(L"IPADDRESS",&ip); > ExitOnFailure(hr, "Failure in IPADDRESS"); > > if(ip == L"" || ip == NULL) > { > ip = L"127.0.0.1"; > } > WcaLog(LOGMSG_STANDARD, (PCSTR)ip); > LPWSTR ssl = NULL; > hr = WcaGetProperty(L"SSL",&ssl); > ExitOnFailure(hr, "Failure in SSL"); > > if(ssl == L"" || ssl == NULL) > { > ssl = L"False"; > } > LPWSTR comp = NULL; > hr = WcaGetProperty(L"COMPRESSION",&comp); > ExitOnFailure(hr, "Failure in COMPRESSION"); > > if(comp == L"" || comp == NULL) > { > comp = L"True"; > } > > WcaLog(LOGMSG_STANDARD, "Got the Parameters"); > char buffer[150]; > sprintf(buffer, "{\n\"ipaddress\": \"%s\",\n\"ssl\": > \"%s\",\n\"compression\":\"%s\"\n}",ip,ssl,comp); > WcaLog(LOGMSG_STANDARD, "Config Generated is : "); > WcaLog(LOGMSG_STANDARD, buffer); > > HANDLE hFile; > hFile = CreateFile(L"C://LogPointAgent//some_config.config", > // name of the write > GENERIC_WRITE, // open for writing > 0, // do not share > NULL, // default security > CREATE_NEW, // create new file only > FILE_ATTRIBUTE_NORMAL, // normal file > NULL); > > if (hFile == INVALID_HANDLE_VALUE) > { > WcaLog(LOGMSG_STANDARD, "Invalid Handle for Config File"); > ExitFunction(); > } > BOOL bErrorFlag; > DWORD dwBytesToWrite = (DWORD)strlen(buffer); > DWORD dwBytesWritten = 0; > bErrorFlag = WriteFile( > hFile, // open file handle > buffer, // start of data to write > dwBytesToWrite, // number of bytes to write > &dwBytesWritten, // number of bytes that were written > NULL); // no overlapped structure > > > if (FALSE == bErrorFlag) > { > WcaLog(LOGMSG_STANDARD, "Terminal failure: Unable to write to > file.\n"); > } > else > { > if (dwBytesWritten != dwBytesToWrite) > { > // This is an error because a synchronous write that results in > // success (WriteFile returns TRUE) should write all data as > // requested. This would not necessarily be the case for > // asynchronous writes. > WcaLog(LOGMSG_STANDARD, "Error: dwBytesWritten != > dwBytesToWrite\n"); > } > else > { > WcaLog(LOGMSG_STANDARD, "Wrote Config file Successfully"); > } > } > > CloseHandle(hFile);LExit: > er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; > return WcaFinalize(er);} > > UINT __stdcall DeleteResidue(MSIHANDLE hInstall){ > HRESULT hr = S_OK; > UINT er = ERROR_SUCCESS; > > hr = WcaInitialize(hInstall, "DeleteResidue"); > ExitOnFailure(hr, "Failed to initialize"); > LExit: > er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; > return WcaFinalize(er);}// DllMain - Initialize and cleanup WiX > custom action utils.extern "C" BOOL WINAPI DllMain( > __in HINSTANCE hInst, > __in ULONG ulReason, > __in LPVOID > ){ > switch(ulReason) > { > case DLL_PROCESS_ATTACH: > WcaGlobalInitialize(hInst); > break; > > case DLL_PROCESS_DETACH: > WcaGlobalFinalize(); > break; > } > > return TRUE;} > > C++ code is successfully compiled. When used in Wix as: > > <Binary Id="SetupCA" > SourceFile="..\WixCustomActionCPP\bin\Release\WixCustomActionCPP.dll"/><CustomAction > Id="WRITEFILETODISK" Execute="immediate" BinaryKey="SetupCA" > DllEntry="WriteFileToDisk" /><InstallExecuteSequence> > <Custom Action="WRITEFILETODISK" Before="InstallFinalize">NOT > Installed</Custom></InstallExecuteSequence> > > When installer is supposed to get installed as msiexec /i installer.msi > /l*v out.txt IPADDRESS="192.168.2.208", following config should have been > created > > {"ip":"192.168.2.208","ssl":"False","compression":"True"} > > but what it generates is: > > {"ipaddress": "1","ssl": "","compression":""} > > What is wrong in my C++ code here? Any help would be appreciated. Thanks. -- J. J. Farrell ------------------------------------------------------------------------------ Dive into the World of Parallel Programming The Go Parallel Website, sponsored by Intel and developed in partnership with Slashdot Media, is your hub for all things parallel software development, from weekly thought leadership blogs to news, videos, case studies, tutorials and more. Take a look and join the conversation now. http://goparallel.sourceforge.net/ _______________________________________________ WiX-users mailing list WiX-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/wix-users