[wix-users] Pass install directory to function in DLL for use at end of uninstall

Lewie Fitz lewfitz at gmail.com
Sun May 29 18:26:04 PDT 2016


OH NO! Look at that comma!!!

"CustomActionData,"

Oh brother. Talk about right in front of my nose...

Michael,

You were right. My sending a size smaller than the length of the buffer 
to the second call was causing the function to return the error value. 
Thank you so much for helping me with that. It's all working now.

yay!

On 5/29/2016 6:16 AM, Lewie Fitz wrote:
>
> Thank you for your response. What you say might be true. The problem 
> is, however, that pchValueBuf (size) always contains 0 after the first 
> call to MsiGetProperty.
>
>
> On 5/29/2016 5:05 AM, Michael Urman wrote:
>> If you debug, I bet you'll see you sill receive ERROR_MORE_DATA from your
>> second call to MsiGetProperty. So reviewing the documentation of
>> *pchValueBuf* more closely, you are required to pass in a value that
>> represents space for a trailing null character, but the output value from
>> MsiGetProperty never includes this. So your vector length of (size + 1) is
>> good, but that also needs to be the value of size in your second call.
>>
>> On Sun, May 29, 2016 at 12:01 AM, Lewie Fitz<lewfitz at gmail.com>  wrote:
>>
>>> Hello,
>>>
>>> I am trying to pass the install directory to a custom action function in
>>> my DLL written in C++, but I can't get it to work.
>>>
>>> The calling of the function works properly. Every time I execute the
>>> uninstall, I get a messagebox at the end. The problem is, I only ever get
>>> the error messagebox.
>>>
>>> To pass the install directory to the DLL function, I am using the method
>>> suggested by several articles online and by MSDN itself for deferred
>>> execution of a custom action. I am trying to set the install dir string to
>>> a property named after my deferred custom action.
>>>
>>> The following is the important bits of what I have done:
>>>
>>> WIX file
>>>
>>>          <Directory Id="TARGETDIR" Name="SourceDir">
>>>              <Directory Id="PublicDir">
>>>                  <Directory Id="APPLICATIONROOTDIRECTORY" Name="AppName"/>
>>>              </Directory>
>>>          </Directory>
>>>
>>>          <Binary Id="CustomUninstall"
>>> SourceFile="SourceFiles\CustomUninstall.dll"/>
>>>          <CustomAction Id="SetCustomActionData" Return="check"
>>> Property="CustomUninstall" Value="[APPLICATIONROOTDIRECTORY]"/>
>>>          <CustomAction Id="CustomUninstall" BinaryKey="CustomUninstall"
>>> DllEntry="_DLLFunction at 4" Execute="deferred" Impersonate="no"
>>> Return="ignore"/>
>>>
>>>          <InstallExecuteSequence>
>>>              <Custom Action="SetCustomActionData" After="CostFinalize"/>
>>>              <Custom Action="CustomUninstall"
>>> Before="InstallFinalize">Installed AND NOT UPGRADINGPRODUCTCODE</Custom>
>>>          </InstallExecuteSequence>
>>>
>>>
>>> CPP File
>>>
>>> extern "C" __declspec(dllexport) UINT __stdcall DLLFunction(MSIHANDLE
>>> session)
>>> {
>>>      DWORD size = 0;
>>>
>>>      UINT result = MsiGetProperty(session, L"CustomActionData,", L"",
>>> &size);
>>>      //size now contains the size of the property's string, without null
>>> termination
>>>
>>>      std::vector<WCHAR> buffer(size + 1);
>>>
>>>      if (result == ERROR_MORE_DATA)
>>>      {
>>>          result = MsiGetProperty(session, L"CustomActionData,",
>>> buffer.data(), &size);
>>>      }
>>>
>>>      if (result != ERROR_SUCCESS)
>>>      {
>>>          MessageBox(NULL, L"Error", L"", MB_OK);
>>>      }
>>>      else
>>>      {
>>>          std::wstring dir(buffer.data());
>>>          MessageBox(NULL, dir.c_str(), L"", MB_OK);
>>>      }
>>>
>>>      return ERROR_SUCCESS;
>>> }
>>>
>>>
>>> ---
>>> This email has been checked for viruses by Avast antivirus software.
>>> https://www.avast.com/antivirus
>>>
>>>
>>> ____________________________________________________________________
>>> WiX Toolset Users Mailing List provided by FireGiant
>>> http://www.firegiant.com/
>>>
>> ____________________________________________________________________
>> WiX Toolset Users Mailing List provided by FireGianthttp://www.firegiant.com/
>



---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus



More information about the wix-users mailing list