{"id":4243,"date":"2009-10-08T14:20:00","date_gmt":"2009-10-08T14:20:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/vcblog\/2009\/10\/08\/the-atlmfc-trace-tool-and-the-tracing-mechanism\/"},"modified":"2019-02-18T18:45:46","modified_gmt":"2019-02-18T18:45:46","slug":"the-atlmfc-trace-tool-and-the-tracing-mechanism","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cppblog\/the-atlmfc-trace-tool-and-the-tracing-mechanism\/","title":{"rendered":"The ATL\/MFC Trace Tool and the Tracing Mechanism"},"content":{"rendered":"<p class=\"MsoNormal\"><font face=\"Calibri\"><span>Hi, I am Pat Brenner, a Software Design Engineer in the Visual C++ Libraries group.&nbsp; Some time back I wrote about Spy++.&nbsp; Today, I am going to write about another Visual Studio debugging tool, the ATL\/MFC Trace Tool, and the tracing mechanism that it interacts with in ATL and MFC.<\/span><span><\/span><\/font><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">The tracing mechanism<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">The tracing mechanism is used to control the type of information, and the amount of that information, that is dumped to the output window during execution of a program.&nbsp; There are a number of categories of information, and different levels of that information, that can be <\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">displayed.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">The tracing macros<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">An application can output tracing messages to the output window by:<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">using the ATLTRACE macros (for ATL), defined in atltrace.h.<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">using the TRACE macros (for MFC) defined in afx.h.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">There are uses of the ATLTRACE and TRACE macros sprinkled throughout the ATL and MFC source code.&nbsp; For example, in CStringT.h in the atlmfc\\include folder, in the CStringT::CheckImplicitLoad method, you can find this line of code:<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">ATLTRACE( atlTraceString, 2, _T( &#8220;Warning: implicit LoadString(%u) failed\\n&#8221; ), nID );<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">This will dump the message to the output window if level-2 messages in the string category are turned on.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">The ATL\/MFC Trace Tool<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">Below is a screen shot of the ATL\/MFC Trace Tool.&nbsp; An MFC application named Editor.exe is running.&nbsp; The \u201catlTraceString\u201d category is selected for the MFC100UD.DLL module in the Editor.exe process.&nbsp; Since a category is selected in the tree, all three of the groups (Process, Module and Category) are enabled.&nbsp; If the Editor.exe process was selected in the tree, only the Process group would be enabled, and if the MFC100UD.DLL module was selected in the tree, only the Process and Module groups would be enabled.&nbsp; With this tool, you can configure exactly what categories you would like to see trace messages for, and what amount of messages in those categories.&nbsp; Here I have indicated that I would like to see a fairly minimal number of trace messages for the entire process, and that the module should inherit the settings from the process, but I have overridden those values and indicated that I want to see a moderate number of trace messages in the string category.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\"><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/wp-content\/uploads\/sites\/9\/2019\/02\/ATL%20MFC%20Trace%20Tool%20and%20the%20Tracing%20Mehanism.png\"><\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">ATL tracing categories<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">The categories of trace information that can be dumped by ATL:<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceGeneral: general and miscellaneous trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceCOM: COM object and method trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceQI: QueryInterface trace messages (category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceRegistrar: registration trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceRefcount: reference count trace messages (category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceWindowing: Windows message trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceControls: ActiveX control related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceHosting: in-place client\/site related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceDBClient: database client related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceDBProvider: database provider related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceSnapin: snap-in related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceNotImpl: \u201cinterface not implemented\u201d trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceAllocation: memory allocation trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceException: \u201cexception thrown\u201d trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceTime: COleDateTime related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceCache: caching related trace messages (category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceStencil: stencil related trace messages (category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceString: CStringT related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceMap: CAtlMap related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceUtil: thread and thread-pool related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceSecurity: CSecurityDesc\/CAccessToken related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceSync: synchronization object related trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceISAPI: ISAPI related trace messages (category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceUser: user-defined trace messages (obsolete category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceUser2: user-defined trace messages (obsolete category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceUser3: user-defined trace messages (obsolete category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">atlTraceUser4: user-defined trace messages (obsolete category not used in ATL or MFC)<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">Note: the categories that are not used internally by ATL or MFC will probably be removed in a future version of ATL, in order to clean up the interface in the ATL\/MFC Trace Tool.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">MFC tracing categories&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">The categories of trace information that can be dumped by MFC:<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceAppMsg: main message pump trace messages, including DDE<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceWinMsg: Windows message trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceCmdRouting: Windows command routing trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceOle: special OLE callback trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceDatabase: special database trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceInternet: special internet client trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceDumpContext: trace messages from CDumpContext<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceMemory: generic non-kernel memory trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceHtml: HTML trace messages<\/font><\/span><\/p>\n<p class=\"MsoListParagraph\"><span><span>\u00b7<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <\/span><\/span><\/span><span><font face=\"Calibri\">traceSocket: socket trace messages<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">Tracing levels<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">The information dumped by the trace mechanism is assigned a level from 0 (zero) to 4, where 0 is the most important level and 4 the least important.&nbsp; These levels correspond to the five ticks on the sliders in the ATL\/MFC Trace Tool.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">Tying it together<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">So, based on the settings I set in the ATL\/MFC Trace Tool above, the source line above in CStringT.h will dump out the message to the output window, because although I have indicated that I want only level-0 and level-1 messages from the process, I want level-2 messages in the string category.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">How it works<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">When a module is loaded that is using debug ATL (ATLSD.LIB), part of the initialization process is the initialization of the global CAtlAllocator object g_Allocator (see externs.cpp in the atlmfc\\src\\ATL\\ATLS folder).&nbsp; This method creates a named shared memory area, and part of the name is the process ID (e.g., for process EB0A, the shared memory area is named \u201cAtlDebugAllocator_FileMappingNameStatic_100_EB0A\u201d).&nbsp; This shared memory area is used to contain all the settings for the process, modules and categories that can be modified by the ATL\/MFC Trace Tool.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">When the ATL\/MFC Trace Tool is started up, it first enumerates all the process in the system, and for each, checks to see if a named shared memory exists for that process (using the naming scheme mentioned above.&nbsp; If so, then the tool loads up all the settings for that process and from then on is able to modify the settings for the process in the shared memory area, thus affecting the runtime trace behavior of that process.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><b><span><font face=\"Calibri\">An interesting recent discovery<\/font><\/span><\/b><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">We have implemented support in ATL and MFC for preview, thumbnail and filter (search) handlers.&nbsp; These are loaded by the Windows Explorer and other Windows components (including the Windows Search service).&nbsp; Recently we had an issue where the Windows Search component could not load our debug DLL, so we never got search filter results in indexed locations.&nbsp; As it turns out, this was because the search filter host (which loaded the ATL filter handler DLL in order to do the indexing) was running without any file system permissions.&nbsp; The ATL tracing mechanism, however, tries to set up the shared memory area (for communication with the ATL\/MFC Trace Tool) using the CreateFileMapping API.&nbsp; The lack of file system permissions caused this to fail, and the DLL initialization was aborted, and thus our filter handler was not called.&nbsp; Apparently this is an issue that has lurked in ATL since the tracing mechanism was invented.&nbsp; So, in order to fix this issue, I had to allow DLL initialization to continue if the tracing initialization failed, and then simply bail out of any further calls into the tracing mechanism if the initialization had failed.&nbsp; This then allowed the DLL to load and the filter handler was called correctly, and the bug was fixed.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">&nbsp;<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">I hope this has been interesting.&nbsp; Let me know if you have any questions.<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">Pat Brenner<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><span><font face=\"Calibri\">Visual C++ Libraries Development<\/font><\/span><\/p>\n<p class=\"MsoNormal\"><font face=\"Calibri\" size=\"3\">&nbsp;<\/font><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hi, I am Pat Brenner, a Software Design Engineer in the Visual C++ Libraries group.&nbsp; Some time back I wrote about Spy++.&nbsp; Today, I am going to write about another Visual Studio debugging tool, the ATL\/MFC Trace Tool, and the tracing mechanism that it interacts with in ATL and MFC. The tracing mechanism The tracing [&hellip;]<\/p>\n","protected":false},"author":289,"featured_media":35994,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[23,10],"class_list":["post-4243","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cplusplus","tag-atl","tag-mfc"],"acf":[],"blog_post_summary":"<p>Hi, I am Pat Brenner, a Software Design Engineer in the Visual C++ Libraries group.&nbsp; Some time back I wrote about Spy++.&nbsp; Today, I am going to write about another Visual Studio debugging tool, the ATL\/MFC Trace Tool, and the tracing mechanism that it interacts with in ATL and MFC. The tracing mechanism The tracing [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4243","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/users\/289"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/comments?post=4243"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/posts\/4243\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media\/35994"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/media?parent=4243"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/categories?post=4243"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cppblog\/wp-json\/wp\/v2\/tags?post=4243"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}