Hi Joe,
It is the same for the deferred custom actions as you do for the immediately custom actions. You pass hMSI and use MsiGetProperty to get the "CustomActionData" property and then you can split this string if you have several properties. This is a part of my code:
UINT_stdcall CopyDemoKeys(MSIHANDLE hInstall)
{
char szCustomActionData[MAX_PATH]="";
char *pszProperty = szCustomActionData;
char szSourceDirFile[MAX_PATH]="";
char szTargetDirFile[MAX_PATH]="";
char szSourceDir[MAX_PATH]="";
DWORD dwSourceDir = MAX_PATH;
char szTargetDir[MAX_PATH]="";
BOOL bRet;
// get property CustomActionData
MsiGetProperty(hInstall, "CustomActionData", szCustomActionData, &dwSourceDir);
// split property to SourceDir and InstallDir
strncat(szSourceDir, szCustomActionData, strcspn(szCustomActionData, ";"));
// point to InstallDir
pszProperty += strlen(szSourceDir) + 1;
strncat(szTargetDir, pszProperty, strcspn(pszProperty, ":"));
........
You set target in this deferred custom action as [Prop1];[Prop2].
Good luck!