{"record":{"id":"4a967fa0f6fe1dc9","repo":"iOfficeAI/OfficeCLI","slug":"app-not-authentic-name","errorCode":null,"errorMessage":"app_not_authentic: {name}","messagePattern":"app_not_authentic: (.+?)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"warning","filePath":"src/officecli/Core/PowerPointPngBackend.cs","lineNumber":86,"sourceCode":"        });\n        th.SetApartmentState(ApartmentState.STA);\n        th.IsBackground = true;\n        th.Start();\n        if (!th.Join(timeoutMs + 30000)) return null;\n        if (error != null) return null;\n        return result;\n    }\n\n    static byte[]? RenderGridCore(string pptx, int startSlide, int endSlide, int cellW, int cellH, int cols, int gap, int pad, int timeoutMs, List<string> tmp)\n    {\n        if (cols < 1) cols = 1;\n        var clsid = G_App; var iid = WordPdfBackend.G_IDispatch;\n        WordPdfBackend.CoCreateInstance(ref clsid, IntPtr.Zero, 4, ref iid, out var app);\n        try\n        {\n            var name = (string?)WordPdfBackend.DispGet(app, \"Name\") ?? \"\";\n            if (!name.Contains(\"PowerPoint\", StringComparison.OrdinalIgnoreCase))\n                throw new InvalidOperationException(\"app_not_authentic: \" + name);\n            try { WordPdfBackend.DispSet(app, \"DisplayAlerts\", 1); } catch { /* alerts-none; ignore if unsettable */ }\n\n            var presentations = (IntPtr)WordPdfBackend.DispGet(app, \"Presentations\")!;\n            try\n            {\n                var pres = (IntPtr)WordPdfBackend.DispMethod(presentations, \"Open\", Path.GetFullPath(pptx), -1, 0, 0)!;\n                try\n                {\n                    var slides = (IntPtr)WordPdfBackend.DispGet(pres, \"Slides\")!;\n                    try\n                    {\n                        var count = WaitForCount(slides, timeoutMs);\n                        int s = Math.Max(1, startSlide);\n                        int e = Math.Min(count, endSlide <= 0 ? count : endSlide);\n                        if (e < s) return null;\n                        int n = e - s + 1;\n                        int rows = (n + cols - 1) / cols;\n","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Core/PowerPointPngBackend.cs#L68-L104","documentation":"Thrown inside PowerPointPngBackend.RenderGridCore when CoCreateInstance for PowerPoint's CLSID (91493441-5A91-11CF-8700-00AA0060263B) returns an IDispatch whose Name property does not contain 'PowerPoint'. This is a COM-authenticity guard: it detects when a different application (or a stub/viewer) is registered under PowerPoint's CLSID. The exception is caught internally by RenderGrid's STA thread and results in a null return, causing the caller to fall back to HTML screenshot rendering — the user never sees this error text directly.","triggerScenarios":"PowerPointPngBackend.RenderGrid(...) → RenderGridCore(...) calls CoCreateInstance(ref G_App, ...) then DispGet(app, \"Name\"). If the Name doesn't contain 'PowerPoint' (case-insensitive), the guard fires. This can happen when only PowerPoint Viewer is installed, when a different COM server hijacked the CLSID, or when a 32/64-bit mismatch resolves to a wrong surrogate.","commonSituations":"Machine has PowerPoint Viewer (not full PowerPoint) registered under the CLSID. COM registration is corrupted — a repair or reinstall is needed. 32-bit vs 64-bit COM surrogate mismatch on Windows. A third-party presentation tool registered itself under PowerPoint's CLSID. PowerPoint trial expired and fell back to a viewer shell.","solutions":["Install full Microsoft PowerPoint (not just the Viewer) and verify it launches manually.","Run Office Repair: Settings → Apps → Microsoft 365/Office → Modify → Online Repair, which re-registers COM classes.","Check COM registration: run 'regedit' and verify HKCR\\PowerPoint.Application\\CLSID points to the correct server DLL/exe.","Verify bitness: a 64-bit OfficeCLI needs a 64-bit PowerPoint COM server (or a working cross-bitness surrogate).","Since this error is caught internally and triggers HTML fallback, rendering will still work — just slower and lower quality. If that's acceptable, no action is needed."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Before rendering, verify PowerPoint COM is available\nstatic bool IsPowerPointAvailable()\n{\n    try\n    {\n        var t = Type.GetTypeFromProgID(\"PowerPoint.Application\");\n        return t != null;\n    }\n    catch { return false; }\n}\n\nif (!IsPowerPointAvailable())\n    Console.Error.WriteLine(\"PowerPoint COM not available — will fall back to HTML rendering.\");","typeGuard":null,"tryCatchPattern":"// This error is caught internally by PowerPointPngBackend — the caller\n// already handles it via null return. No additional try-catch needed:\nvar png = PowerPointPngBackend.RenderGrid(pptx, start, end, ...);\nif (png is null)\n{\n    // PowerPoint unavailable or app_not_authentic — fall back to HTML path.\n    png = HtmlScreenshotRenderer.Render(pptx, start, end, ...);\n}","preventionTips":["Install full Microsoft PowerPoint (not just the Viewer) for COM-based PNG rendering.","Run Office Repair to fix corrupted COM registrations.","Accept HTML fallback as a graceful degradation when PowerPoint isn't available.","Check bitness compatibility between OfficeCLI and the PowerPoint COM server."],"tags":["powerpoint","com","windows","rendering","automation"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}