MsiEnumProductsEx returnează ERROR_MORE_DATA fără a face nimic

Pe o instalare relativ nouă XP (SP3), obțin rezultate ciudate de la apelurile la MsiEnumProductsEx (de la msi.lib). Aici este codul meu:

    TCHAR userId[8] = _T("s-1-1-0");
    UINT result;
    index = 0;
    TCHAR szInstalledProductCode[39];
    TCHAR szSid[40];
    MSIINSTALLCONTEXT context;
    DWORD numChars = 40;
    MSIINSTALLCONTEXT context;
    result = MsiEnumProductsEx(NULL, userId, MSIINSTALLCONTEXT_ALL, index, szInstalledProductCode, &context, (LPTSTR)szSid, &numChars);

După această chemare a funcției, toate variabilele de ieșire rămân neschimbate; adică szInstalledProductCode , szSid , context și numChars încercând, de fapt, să le dea valori false și să văd că nu au fost suprascrise. În plus, result este setat la 234; care este, de obicei, indicația că tamponul szSid este prea mic și că trebuie să trec într-un tampon mai mare; variabila numChars trebuie umplută cu această mărime. Cu toate acestea, așa cum am menționat anterior, numChars este lăsat exact așa cum a fost înainte (40), deci apelarea din nou a metodei cu aceeași dimensiune (plus una pentru terminarea null) nu face nimic diferit pentru prima dată.

Când rulez același cod pe alte mașini, se comportă exact modul în care documentația spune că ar trebui să se comporte - umplerea tuturor variabilelor, inclusiv szSid până la lungimea tamponului; și dacă tamponul este prea mic, returnând ERROR_MORE_DATA și umplând numChars cu mărimea potrivită.

Deci, tot ce mă pot gândi este că această instalare de Windows este oarecum ruptă, dar trebuie să înțelegem cauza principală a ceea ce este în mod greșit în Windows. Poate cineva să-mi dea îndrumare; chiar dacă sunt doar anumite căi de investigat?

1

1 răspunsuri

Iată cum am rezolvat aceasta:

Am folosit ProcessMonitor de la SysInternals pentru a vedea ce face în spatele scenei (comparând asta cu utilizarea ProcessMonitor pe o mașină care funcționa de fapt). Am observat că diferența a fost că, de îndată ce se uita în HKCR/Installer/Products, a început legarea procesului (în timp ce pe PC-ul de lucru, a continuat să obțină informații de instalare din registru). Sa dovedit că a existat un cod de produs malformat (cumva o cratimă la începutul acestuia) acolo și funcția a eșuat. Nici o idee despre cum a ajuns acolo, dar tu te duci.

0
adăugat
Lucruri similare, dar diferite: blog.iswix.com/ 2011/11/& hellip;
adăugat autor Christopher Painter, sursa