{"id":1245,"date":"2015-10-16T19:48:41","date_gmt":"2015-10-16T19:48:41","guid":{"rendered":"http:\/\/elbsolutions.com\/projects\/?p=1245"},"modified":"2022-02-03T11:24:35","modified_gmt":"2022-02-03T17:24:35","slug":"piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager","status":"publish","type":"post","link":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/","title":{"rendered":"Piggy backing on an Excel Instance &#8211; even when there are a few in Task Manager"},"content":{"rendered":"<p>So I found 1 great article that looked promising but it didn&#8217;t pan out because it was written before a change by Excel. Basically the problem is that GetObject (or c# GetActiveObject) only gets a RANDOM copy of a running instance. If there is more than one instance of Excel, for instance, and you are searching for a workbook (in my case one with a specific named range) you will not find the workbook unless you iterate through all the Application instances of Excel. If you look in Task Manager &#8230; why are there two? Simple. If you are in explorer and you click on a .xls* file and the preview pane is on &#8211; it starts an instance of Excel (one example).<\/p>\n<p><a href=\"http:\/\/stackoverflow.com\/questions\/13807102\/find-all-open-excel-workbooks\" target=\"_blank\" rel=\"noopener noreferrer\">Here is the article<\/a> that did not work and <a href=\"http:\/\/stackoverflow.com\/questions\/779363\/how-to-use-use-late-binding-to-get-excel-instance\" target=\"_blank\" rel=\"noopener noreferrer\">here is a complicated one that is just as good as the GetObject (it gets only once instance) <\/a>&#8230; HOWEVER &#8230; combining the two &#8230; now that is magic. I got it working. This article is a sub-article of the <a href=\"http:\/\/elbsolutions.com\/projects\/a-custom-clickable-url-opens-autocad-and-zooms-into-a-specific-autoplant-part-i-cant-believe-i-pulled-this-off\/\" target=\"_blank\" rel=\"noopener noreferrer\">last post in which I iterated over all apps searching for a .visible instance in which to piggy back and run VBA the code in Excel<\/a>. Why? Because I had LOTS of previous code already written in Excel &#8211; I just needed it to run. It starts and drives AutoCAD.<!--more--><\/p>\n<p>Final Code &#8211; mostly the same as the 2nd link above.<\/p>\n<p>look for my lines called \/\/ SUBSTITUTE and \/\/ NEW to understand the before and after picture. It works. I also return a List&lt;Application&gt; object which is different from the original which simply spit out the results to the Console. It is these sets that I iterate over trying desperately to use a .Visible application object over an hidden one.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nusing System;\r\nusing System.Collections.Generic; \/\/NEW\r\nusing System.Globalization;\r\nusing System.Reflection;\r\nusing System.Runtime.InteropServices;\r\nusing System.Text;\r\n\r\nnamespace WspAlertTestCL\r\n{\r\n\r\n \/\/\/ &amp;lt;summary&amp;gt;\r\n \/\/\/ Interface definition for Excel.Window interface\r\n \/\/\/ &amp;lt;\/summary&amp;gt;\r\n &#x5B;Guid(&quot;00020893-0000-0000-C000-000000000046&quot;)]\r\n &#x5B;InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]\r\n public interface ExcelWindow\r\n {\r\n }\r\n\r\n \/\/\/ &amp;lt;summary&amp;gt;\r\n \/\/\/ This class is needed as a workaround to http:\/\/support.microsoft.com\/default.aspx?scid=kb;en-us;320369\r\n \/\/\/ Excel automation will fail with the follwoing error on systems with non-English regional settings:\r\n \/\/\/ &quot;Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD))&quot; \r\n \/\/\/ &amp;lt;\/summary&amp;gt;\r\n class UILanguageHelper : IDisposable\r\n {\r\n private CultureInfo _currentCulture;\r\n\r\n public UILanguageHelper()\r\n {\r\n \/\/ save current culture and set culture to en-US \r\n _currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;\r\n System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(&quot;en-US&quot;);\r\n }\r\n\r\n public void Dispose()\r\n {\r\n \/\/ reset to original culture \r\n System.Threading.Thread.CurrentThread.CurrentCulture = _currentCulture;\r\n }\r\n }\r\n\r\n \/\/class Program \/\/SUBSTITUTE\r\n class ExcelWIndowIterator \/\/NEW\r\n {\r\n &#x5B;DllImport(&quot;user32.dll&quot;, SetLastError = true)] \/\/SUBSTITUTE - we probably don't need this any longer.\r\n static extern IntPtr FindWindow(string lpClassName, string lpWindowName); \/\/SUBSTITUTE - we probably don't need this any longer.\r\n\r\n &#x5B;DllImport(&quot;Oleacc.dll&quot;)]\r\n static extern int AccessibleObjectFromWindow(int hwnd, uint dwObjectID, byte&#x5B;] riid, out ExcelWindow ptr);\r\n\r\n public delegate bool EnumChildCallback(int hwnd, ref int lParam);\r\n\r\n &#x5B;DllImport(&quot;User32.dll&quot;)]\r\n public static extern bool EnumChildWindows(int hWndParent, EnumChildCallback lpEnumFunc, ref int lParam);\r\n\r\n &#x5B;DllImport(&quot;User32.dll&quot;)]\r\n public static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount);\r\n\r\n\r\n &#x5B;DllImport(&quot;User32&quot;)] \/\/ NEW\r\n public static extern int FindWindowEx( \r\n int hwndParent, int hwndChildAfter, string lpszClass,\r\n int missing);\r\n\r\n public static bool EnumChildProc(int hwndChild, ref int lParam)\r\n {\r\n StringBuilder buf = new StringBuilder(128);\r\n GetClassName(hwndChild, buf, 128);\r\n if (buf.ToString() == &quot;EXCEL7&quot;) \/\/ SUBSTITUTE - I will leave this here but perhaps this might last longer in time without a re-write in the future. Only time will tell ... buf.StartsWith(&quot;EXCEL&quot;)\r\n {\r\n lParam = hwndChild;\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n \/\/static void Main(string&#x5B;] args) \/\/SUBSTITUTE\r\n public List&amp;lt;object&amp;gt; MainItems() \/\/NEW (instanciate it w. as a class and access this method to return a list of Excel.apps running\r\n {\r\n \/\/ I got this from here http:\/\/stackoverflow.com\/questions\/779363\/how-to-use-use-late-binding-to-get-excel-instance\r\n \/\/ but this version only got ONE instance. What if there are several instances of Excel running? Well, the following\r\n \/\/ link http:\/\/stackoverflow.com\/questions\/13807102\/find-all-open-excel-workbooks iterated over a few instances, but \r\n \/\/ didn't quite work. So ... but ... putting both ideas together ... BINGO!! as we can iterate over all instances\r\n \/\/ look for my lines called \/\/ SUBSTITUTE and \/\/ NEW\r\n\r\n \/\/ Use the window class name (&quot;XLMAIN&quot;) to retrieve a handle to Excel's main window.\r\n \/\/ Alternatively you can get the window handle via the process id:\r\n \/\/ int hwnd = (int)Process.GetProcessById(excelPid).MainWindowHandle;\r\n\r\n List&amp;lt;object&amp;gt; appList = new List&amp;lt;object&amp;gt;();\r\n\r\n \/\/int hwnd = (int)FindWindow(&quot;XLMAIN&quot;, null); \/\/SUBSTITUTE\r\n int hwnd = FindWindowEx(0, 0, &quot;XLMAIN&quot;, 0);\r\n\r\n \/\/ if (hwnd != 0) \/\/ SUBSTITUTE\r\n while (hwnd != 0) \/\/ NEW\r\n {\r\n int hwndChild = 0;\r\n\r\n \/\/ Search the accessible child window (it has class name &quot;EXCEL7&quot;) \r\n EnumChildCallback cb = new EnumChildCallback(EnumChildProc);\r\n EnumChildWindows(hwnd, cb, ref hwndChild);\r\n\r\n if (hwndChild != 0)\r\n {\r\n \/\/ We call AccessibleObjectFromWindow, passing the constant OBJID_NATIVEOM (defined in winuser.h) \r\n \/\/ and IID_IDispatch - we want an IDispatch pointer into the native object model.\r\n \/\/\r\n const uint OBJID_NATIVEOM = 0xFFFFFFF0;\r\n Guid IID_IDispatch = new Guid(&quot;{00020400-0000-0000-C000-000000000046}&quot;);\r\n ExcelWindow ptr;\r\n\r\n int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), out ptr);\r\n\r\n if (hr &amp;gt;= 0)\r\n {\r\n \/\/ We successfully got a native OM IDispatch pointer, we can QI this for\r\n \/\/ an Excel Application using reflection (and using UILanguageHelper to \r\n \/\/ fix http:\/\/support.microsoft.com\/default.aspx?scid=kb;en-us;320369)\r\n \/\/\r\n using (UILanguageHelper fix = new UILanguageHelper())\r\n {\r\n object xlApp = ptr.GetType().InvokeMember(&quot;Application&quot;, BindingFlags.GetProperty, null, ptr, null);\r\n\r\n object version = xlApp.GetType().InvokeMember(&quot;Version&quot;, BindingFlags.GetField | BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, xlApp, null);\r\n \/\/Console.WriteLine(string.Format(&quot;Excel version is: {0}&quot;, version)); \/\/SUBSTITUTE\r\n Console.WriteLine(string.Format(&quot;Excel handle is: {1} version is: {0}&quot;, version, hwndChild.ToString()));\r\n\r\n appList.Add(xlApp); \/\/NEW\r\n }\r\n \r\n }\r\n }\r\n hwnd = FindWindowEx(0, hwnd, &quot;XLMAIN&quot;, 0); \/\/SUBSTITUTE \/\/get the next instance if there is one\r\n }\r\n return appList; \/\/NEW\r\n }\r\n }\r\n}\r\n\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So I found 1 great article that looked promising but it didn&#8217;t pan out because it was written before a change by Excel. Basically the problem is that GetObject (or c# GetActiveObject) only gets a RANDOM copy of a running instance. If there is more than one instance of Excel, for instance, and you are [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1245","post","type-post","status-publish","format-standard","hentry","category-general"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Piggy backing on an Excel Instance - even when there are a few in Task Manager - ELB Solutions.com Inc.<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Piggy backing on an Excel Instance - even when there are a few in Task Manager - ELB Solutions.com Inc.\" \/>\n<meta property=\"og:description\" content=\"So I found 1 great article that looked promising but it didn&#8217;t pan out because it was written before a change by Excel. Basically the problem is that GetObject (or c# GetActiveObject) only gets a RANDOM copy of a running instance. If there is more than one instance of Excel, for instance, and you are [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/\" \/>\n<meta property=\"og:site_name\" content=\"ELB Solutions.com Inc.\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-16T19:48:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-03T17:24:35+00:00\" \/>\n<meta name=\"author\" content=\"Etienne Bley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Etienne Bley\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/\"},\"author\":{\"name\":\"Etienne Bley\",\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/#\\\/schema\\\/person\\\/51e717c68f4f5917c63baf88f0896c39\"},\"headline\":\"Piggy backing on an Excel Instance &#8211; even when there are a few in Task Manager\",\"datePublished\":\"2015-10-16T19:48:41+00:00\",\"dateModified\":\"2022-02-03T17:24:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/\"},\"wordCount\":1008,\"articleSection\":[\"General\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/\",\"url\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/\",\"name\":\"Piggy backing on an Excel Instance - even when there are a few in Task Manager - ELB Solutions.com Inc.\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/#website\"},\"datePublished\":\"2015-10-16T19:48:41+00:00\",\"dateModified\":\"2022-02-03T17:24:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/#\\\/schema\\\/person\\\/51e717c68f4f5917c63baf88f0896c39\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Piggy backing on an Excel Instance &#8211; even when there are a few in Task Manager\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/#website\",\"url\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/\",\"name\":\"ELB Solutions.com Inc.\",\"description\":\"Bringing all your IT Pieces together\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/#\\\/schema\\\/person\\\/51e717c68f4f5917c63baf88f0896c39\",\"name\":\"Etienne Bley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f8971dfb65b25b768415568f83247df4057f15d037137e386928a804e2c997b9?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f8971dfb65b25b768415568f83247df4057f15d037137e386928a804e2c997b9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f8971dfb65b25b768415568f83247df4057f15d037137e386928a804e2c997b9?s=96&d=mm&r=g\",\"caption\":\"Etienne Bley\"},\"url\":\"https:\\\/\\\/elbsolutions.com\\\/projects\\\/author\\\/etienne-bley\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Piggy backing on an Excel Instance - even when there are a few in Task Manager - ELB Solutions.com Inc.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/","og_locale":"en_US","og_type":"article","og_title":"Piggy backing on an Excel Instance - even when there are a few in Task Manager - ELB Solutions.com Inc.","og_description":"So I found 1 great article that looked promising but it didn&#8217;t pan out because it was written before a change by Excel. Basically the problem is that GetObject (or c# GetActiveObject) only gets a RANDOM copy of a running instance. If there is more than one instance of Excel, for instance, and you are [&hellip;]","og_url":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/","og_site_name":"ELB Solutions.com Inc.","article_published_time":"2015-10-16T19:48:41+00:00","article_modified_time":"2022-02-03T17:24:35+00:00","author":"Etienne Bley","twitter_misc":{"Written by":"Etienne Bley","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/#article","isPartOf":{"@id":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/"},"author":{"name":"Etienne Bley","@id":"https:\/\/elbsolutions.com\/projects\/#\/schema\/person\/51e717c68f4f5917c63baf88f0896c39"},"headline":"Piggy backing on an Excel Instance &#8211; even when there are a few in Task Manager","datePublished":"2015-10-16T19:48:41+00:00","dateModified":"2022-02-03T17:24:35+00:00","mainEntityOfPage":{"@id":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/"},"wordCount":1008,"articleSection":["General"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/","url":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/","name":"Piggy backing on an Excel Instance - even when there are a few in Task Manager - ELB Solutions.com Inc.","isPartOf":{"@id":"https:\/\/elbsolutions.com\/projects\/#website"},"datePublished":"2015-10-16T19:48:41+00:00","dateModified":"2022-02-03T17:24:35+00:00","author":{"@id":"https:\/\/elbsolutions.com\/projects\/#\/schema\/person\/51e717c68f4f5917c63baf88f0896c39"},"breadcrumb":{"@id":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/elbsolutions.com\/projects\/piggy-backing-on-an-excel-instance-even-when-there-are-a-few-in-task-manager\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elbsolutions.com\/projects\/"},{"@type":"ListItem","position":2,"name":"Piggy backing on an Excel Instance &#8211; even when there are a few in Task Manager"}]},{"@type":"WebSite","@id":"https:\/\/elbsolutions.com\/projects\/#website","url":"https:\/\/elbsolutions.com\/projects\/","name":"ELB Solutions.com Inc.","description":"Bringing all your IT Pieces together","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elbsolutions.com\/projects\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/elbsolutions.com\/projects\/#\/schema\/person\/51e717c68f4f5917c63baf88f0896c39","name":"Etienne Bley","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f8971dfb65b25b768415568f83247df4057f15d037137e386928a804e2c997b9?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f8971dfb65b25b768415568f83247df4057f15d037137e386928a804e2c997b9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f8971dfb65b25b768415568f83247df4057f15d037137e386928a804e2c997b9?s=96&d=mm&r=g","caption":"Etienne Bley"},"url":"https:\/\/elbsolutions.com\/projects\/author\/etienne-bley\/"}]}},"_links":{"self":[{"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/posts\/1245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/comments?post=1245"}],"version-history":[{"count":4,"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/posts\/1245\/revisions"}],"predecessor-version":[{"id":2722,"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/posts\/1245\/revisions\/2722"}],"wp:attachment":[{"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/media?parent=1245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/categories?post=1245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elbsolutions.com\/projects\/wp-json\/wp\/v2\/tags?post=1245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}