{"id":702,"date":"2012-11-14T15:37:55","date_gmt":"2012-11-14T23:37:55","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/en\/?p=702"},"modified":"2012-12-28T00:34:23","modified_gmt":"2012-12-28T08:34:23","slug":"shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/","title":{"rendered":"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3"},"content":{"rendered":"<p>Compile Delphi code for 64-bit platform is possible now with <a href=\"http:\/\/www.embarcadero.com\/products\/delphi\" target=\"_blank\">Delphi XE2 and XE3<\/a>, developers can go beyond Windows 32-bit and start creating Windows Shell Extension for Windows 64-bit. Shell Extensions are in-process COM objects which extends the abilities of Windows OS. In this post I&#8217;m going to add two new context menu items in Windows Explorer. The menus will allow users to\u00a0upload files to Microsoft Azure and Amazon S3. This post will go through how to create the extension, register and compile for 32-bit and 64-bit. I&#8217;m preparing another post, in which I will explain how to upload files to Amazon S3 and Microsoft Azure.<\/p>\n<h3>Creating the CloudUpload Shell Extension<\/h3>\n<p>In order to start creating a Shell Extension in Delphi, you first need to create an ActiveX Library project and after that create a new Automation Object. In the example I use for this post, the project name is CloudUpload and the Automation Object is called\u00a0TCloudUploadContext. The TCloudUploadContext class must implement the interfaces IShellExtInit and IContextMenu in order to integrate the Context Menu in Windows Explorer.<\/p>\n<pre class=\"brush: delphi\">    { IShellExtInit Methods }\r\n    { Initialize the context menu if a files was selected}\r\n    function IShellExtInit.Initialize = ShellExtInitialize;\r\n    function ShellExtInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;\r\n      hKeyProgID: HKEY): HResult; stdcall;\r\n\r\n    { IContextMenu Methods }\r\n    { Initializes the context menu and it decides which items appear in it,\r\n      based on the flags you pass }\r\n    function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst, idCmdLast,\r\n      uFlags: UINT): HResult; stdcall;\r\n\r\n    { Execute the command, which will be the upload to Amazon or Azure}\r\n    function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;\r\n    { Set help string on the Explorer status bar when the menu item is selected }\r\n    function GetCommandString(idCmd: UINT_PTR; uFlags: UINT; pwReserved: PUINT;\r\n      pszName: LPSTR; cchMax: UINT): HResult; stdcall;<\/pre>\n<p>The ShellExtInitialize defines if the Context Menu will appear or not in Windows Explorer. In this sample the context menu only shows up if one file has been selected, otherwise no Context Menu. In case only one file was selected the FFileName variable will receive the name of the file.<\/p>\n<pre class=\"brush: delphi\">function TCloudUploadContextMenu.ShellExtInitialize(pidlFolder: PItemIDList;\r\n  lpdobj: IDataObject; hKeyProgID: HKEY): HResult;\r\nvar\r\n  DataFormat: TFormatEtc;\r\n  StrgMedium: TStgMedium;\r\n  Buffer: array [0 .. MAX_PATH] of Char;\r\nbegin\r\n  Result := E_FAIL;\r\n\r\n  { Check if an object was defined }\r\n  if lpdobj = nil then\r\n    Exit;\r\n\r\n  { Prepare to get information about the object }\r\n  DataFormat.cfFormat := CF_HDROP;\r\n  DataFormat.ptd := nil;\r\n  DataFormat.dwAspect := DVASPECT_CONTENT;\r\n  DataFormat.lindex := -1;\r\n  DataFormat.tymed := TYMED_HGLOBAL;\r\n\r\n  if lpdobj.GetData(DataFormat, StrgMedium) &lt;&gt; S_OK then\r\n    Exit;\r\n\r\n  { The implementation now support only one file }\r\n  if DragQueryFile(StrgMedium.hGlobal, $FFFFFFFF, nil, 0) = 1 then\r\n  begin\r\n    SetLength(FFileName, MAX_PATH);\r\n    DragQueryFile(StrgMedium.hGlobal, 0, @Buffer, SizeOf(Buffer));\r\n    FFileName := Buffer;\r\n    Result := NOERROR;\r\n  end\r\n  else\r\n  begin\r\n    \/\/ Don't show the Menu if more then one file was selected\r\n    FFileName := EmptyStr;\r\n    Result := E_FAIL;\r\n  end;\r\n\r\n  { http:\/\/msdn.microsoft.com\/en-us\/library\/ms693491(v=vs.85).aspx }\r\n  ReleaseStgMedium(StrgMedium);\r\n\r\nend;<\/pre>\n<p>After the context menu handler is initialized via the IShellExtInit interface, Windows uses the IContextMenu interface to call the other methods of our context menu handler. In this case it will call QueryContextMenu, GetCommandString and InvokeCommand.<\/p>\n<p>The Context Menu options (<a href=\"http:\/\/aws.amazon.com\/s3\/\" target=\"_blank\">Amazon S3<\/a>, <a href=\"http:\/\/www.microsoft.com\/windowsazure\/features\/storage\/\" target=\"_blank\">Microsoft Azure<\/a>) will be created through the QueryContextMenu method.<\/p>\n<pre class=\"brush: delphi\">function TCloudUploadContextMenu.QueryContextMenu(Menu: HMENU;\r\n  indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult;\r\nvar\r\n  CloudMenuItem: TMenuItemInfo;\r\n  MenuCaption: String;\r\n  SubMenu: HMENU;\r\n  uId: UINT;\r\nbegin\r\n  { only adding one menu CloudMenuItem, so generate the result code accordingly }\r\n  Result := MakeResult(SEVERITY_SUCCESS, 0, 3);\r\n\r\n  { store the menu CloudMenuItem index }\r\n  FMenuItemIndex := indexMenu;\r\n\r\n  { specify what the menu says, depending on where it was spawned }\r\n  if (uFlags = CMF_NORMAL) then \/\/ from the desktop\r\n    MenuCaption := 'Send file from Desktop to the Cloud'\r\n  else if (uFlags and CMF_VERBSONLY) = CMF_VERBSONLY then \/\/ from a shortcut\r\n    MenuCaption := 'Send file from Shourtcut to the Cloud'\r\n  else if (uFlags and CMF_EXPLORE) = CMF_EXPLORE then \/\/ from explorer\r\n    MenuCaption := 'Send file from Explorer to the Cloud'\r\n  else\r\n    { fail for any other value }\r\n    Result := E_FAIL;\r\n\r\n  if Result &lt;&gt; E_FAIL then\r\n  begin\r\n\r\n    SubMenu := CreatePopupMenu;\r\n\r\n    uId := idCmdFirst;\r\n    InsertMenu(SubMenu, AmazonIndex, MF_BYPOSITION, uId, TClouds[AmazonIndex]);\r\n\r\n    Inc(uId);\r\n    InsertMenu(SubMenu, AzureIndex, MF_BYPOSITION, uId, TClouds[AzureIndex]);\r\n\r\n    FillChar(CloudMenuItem, SizeOf(TMenuItemInfo), #0);\r\n    CloudMenuItem.cbSize := SizeOf(TMenuItemInfo);\r\n    CloudMenuItem.fMask := MIIM_SUBMENU or MIIM_STRING or MIIM_ID;\r\n    CloudMenuItem.fType := MFT_STRING;\r\n    CloudMenuItem.wID := FMenuItemIndex;\r\n    CloudMenuItem.hSubMenu := SubMenu;\r\n    CloudMenuItem.dwTypeData := PWideChar(MenuCaption);\r\n    CloudMenuItem.cch := Length(MenuCaption);\r\n\r\n    InsertMenuItem(Menu, indexMenu, True, CloudMenuItem);\r\n  end;\r\nend;<\/pre>\n<p>When you are in the Windows Explorer and you pass the mouse over one of the Cloud menu items a short help message is displayed in the Windows Explorer status bar, it is defined on the implementation of the method GetCommandString, which returns a string to the Windows Explorer to display.<\/p>\n<p>function TCloudUploadContextMenu.GetCommandString(idCmd: UINT_PTR; uFlags: UINT;<\/p>\n<pre class=\"brush: delphi\">  pwReserved: PUINT; pszName: LPSTR; cchMax: UINT): HResult;\r\nbegin\r\n  Result := E_INVALIDARG;\r\n\r\n  { Set help string on the Explorer status bar when the menu item is selected }\r\n  if (idCmd in [AmazonIndex, AzureIndex]) and (uFlags = GCS_HELPTEXT) then\r\n  begin\r\n    StrLCopy(PWideChar(pszName), PWideChar('Copy the selected file to ' +\r\n      TClouds[idCmd]), cchMax);\r\n    Result := NOERROR;\r\n  end;\r\n\r\nend;<\/pre>\n<p>As the user clicks in one of the Cloud menu items, the method InvokeCommand will be called and start the process to upload the selected file to the Cloud selected. At this point we already have the file name and based on the lpici parameters we can identify what menu item the user clicked.<\/p>\n<pre class=\"brush: delphi\">function TCloudUploadContextMenu.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;\r\nvar\r\n  Item: Word;\r\nbegin\r\n  Result := E_FAIL;\r\n\r\n  if HiWord(Integer(lpici.lpVerb)) &lt;&gt; 0 then\r\n    Exit;\r\n\r\n  { if the index matches the index for the menu, show the cloud options }\r\n  Item := LoWord(Integer(lpici.lpVerb));\r\n\r\n  if Item in [AmazonIndex, AzureIndex] then\r\n  begin\r\n    try\r\n      Upload(lpici.HWND, Item, FFileName);\r\n    except\r\n      on E: Exception do\r\n        MessageBox(lpici.hwnd, PWideChar(E.Message), 'Cloud Upload', MB_ICONERROR);\r\n\r\n    end;\r\n    Result := NOERROR;\r\n  end;\r\n\r\nend;<\/pre>\n<p>In order for the COM object to be created whenever the CloudUpload is loaded, it&#8217;s necessary to create an instance of a class factory that specifically creates an instance of the shell extension object, the factory instance will be created on the initialization section, based on the following code, which is a replacement for the default code created by Delphi.<\/p>\n<pre class=\"brush: delphi\">initialization\r\n  TCloudUploadObjectFactory.Create(ComServer, TCloudUploadContextMenu, CLASS_CloudUploadContextMenu, ciMultiInstance, tmApartment);\r\nend.<\/pre>\n<p>Since the class factory will be responsible to register\/unregister the DLL, the methods ApproveShellExtension and UpdateRegistry will be invoked, it will happen when you use the regsvr32.exe.<\/p>\n<pre class=\"brush: delphi\">  { the new class factory }\r\n  TCloudUploadObjectFactory = class(TAutoObjectFactory)\r\n  protected\r\n    procedure ApproveShellExtension(&amp;Register: Boolean; const ClsID: string);\r\n    function GetProgID: string; override;\r\n  public\r\n    procedure UpdateRegistry(Register: Boolean); override;\r\n  end;\r\n\r\n{ TCloudUploadObjectFactory }\r\n\r\n{ Required to registration for Windows NT\/2000 }\r\nprocedure TCloudUploadObjectFactory.ApproveShellExtension(&amp;Register: Boolean;\r\n  const ClsID: string);\r\nConst\r\n  WinNTRegKey =\r\n    'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved';\r\nvar\r\n  Reg: TRegistry;\r\nbegin\r\n  Reg := TRegistry.Create;\r\n\r\n  try\r\n    Reg.RootKey := HKEY_LOCAL_MACHINE;\r\n\r\n    if not Reg.OpenKey(WinNTRegKey, True) then\r\n      Exit;\r\n\r\n    { register the extension appropriately }\r\n    if &amp;Register then\r\n      Reg.WriteString(ClsID, Description)\r\n    else\r\n      Reg.DeleteValue(ClsID);\r\n  finally\r\n    Reg.Free;\r\n  end;\r\n\r\nend;\r\n\r\nfunction TCloudUploadObjectFactory.GetProgID: string;\r\nbegin\r\n  { ProgID not required for shell extensions }\r\n  Result := '';\r\nend;\r\n\r\nprocedure TCloudUploadObjectFactory.UpdateRegistry(Register: Boolean);\r\nConst\r\n  ContextKey = '*\\shellex\\ContextMenuHandlers\\%s';\r\nbegin\r\n  { perform normal registration }\r\n  inherited UpdateRegistry(Register);\r\n\r\n  { Registration required for Windows NT\/2000 }\r\n  ApproveShellExtension(Register, GUIDToString(ClassID));\r\n\r\n  { if this server is being registered, register the required key\/values\r\n    to expose it to Explorer }\r\n  if Register then\r\n    CreateRegKey(Format(ContextKey, [ClassName]), '', GUIDToString(ClassID),\r\n      HKEY_CLASSES_ROOT)\r\n  else\r\n    DeleteRegKey(Format(ContextKey, [ClassName]));\r\n\r\nend;<\/pre>\n<h3>Compile for 32-bit or 64-bit platform<\/h3>\n<p>At this point we just need to compile the extension, for this sample the Win APIs and RTL methods are the same for both platforms, we don&#8217;t need any specific code. You can define the target platform through the Project Manager, by default your project target 32-bit Windows, right click on Target Platforms to add 64-bit Windows.<\/p>\n<p><a href=\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2012\/11\/Platform.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-894\" alt=\"Delphi Project Manager - Platform\" src=\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2012\/11\/Platform-209x300.png\" width=\"209\" height=\"300\" srcset=\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2012\/11\/Platform-209x300.png 209w, http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2012\/11\/Platform.png 294w\" sizes=\"auto, (max-width: 209px) 100vw, 209px\" \/><\/a><\/p>\n<p>You can&#8217;t register 32-bit dll in 64-bit operation system, and you can not register 64-bit dll in 32-bit operation system. If you are using your develop machine to test, compile for the platform compatible with your OS.<\/p>\n<p>&nbsp;<\/p>\n<h3>Registering the CloudUpload Shell Extension<\/h3>\n<p>First, you must Run as Administrator the application you are going to use to register the shell extensions even if you are the Administrator user.<\/p>\n<p>32-bit shell extensions can be registered through the IDE, and command line (cmd) can be used to register 32-bit and 64-bit.<\/p>\n<p>Here the cmd line to register and unregister:<\/p>\n<p>&#8211; Run as Administrator the cmd;<\/p>\n<p>&#8211; Register the extension using the following command line: regsvr32 &lt;PATH WHERE IS LOCATED THE DLL&gt;CloudUpload.dll<\/p>\n<p>&#8211; To unregister the extension using the following command line: regsvr32 &lt;PATH WHERE IS LOCATED THE DLL&gt;CloudUpload.dll \/u<\/p>\n<p>After register the DLL you can\u00a0open the Windows Explorer, select one file and right click, you will see the new menu &#8220;Send file from Explorer to the Cloud&#8221;. The following screenshot show the shell extension on my Windows 7 64-bit.<\/p>\n<p><a href=\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2012\/11\/Windows-ShellExtension.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"Shell Extension - Windows Explorer\" src=\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2012\/11\/Windows-ShellExtension.png\" width=\"796\" height=\"377\" \/><\/a><\/p>\n<p>You can download he source code in 2 different ways:<\/p>\n<ul>\n<li>Use the <a href=\"http:\/\/www.embarcadero.com\/products\/rad-studio\/downloads\" target=\"_blank\">RAD Studio XE2 or XE3 IDE<\/a> menu File option &#8220;Open from Version Control&#8221; and set the URL to <a href=\"https:\/\/radstudiodemos.svn.sourceforge.net\/svnroot\/radstudiodemos\/branches\/RadStudio_XE2\/Delphi\/CloudAPI\/CloudUpload\" target=\"_blank\">https:\/\/radstudiodemos.svn.sourceforge.net\/svnroot\/radstudiodemos\/branches\/RadStudio_XE2\/Delphi\/CloudAPI\/CloudUpload<\/a>\u00a0for XE2 and\u00a0<a href=\"https:\/\/radstudiodemos.svn.sourceforge.net\/svnroot\/radstudiodemos\/branches\/RadStudio_XE3\/Delphi\/CloudAPI\/CloudUpload\" target=\"_blank\">https:\/\/radstudiodemos.svn.sourceforge.net\/svnroot\/radstudiodemos\/branches\/RadStudio_XE3\/Delphi\/CloudAPI\/CloudUpload<\/a>\u00a0for XE3<\/li>\n<li>Update your RAD Studio XE2 or XE3 local demo repository, in case you use TortoiseSVN just right click on the C:\\Users\\Public\\Documents\\RAD Studio\\9.0\\Samples\\Delphi folder and select update;<\/li>\n<\/ul>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Compile Delphi code for 64-bit platform is possible now with Delphi XE2 and XE3, developers can go beyond Windows 32-bit and start creating Windows Shell Extension for Windows 64-bit. Shell Extensions are in-process COM objects which extends the abilities of Windows OS. In this post I&#8217;m going to add two new context menu items in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":797,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"yes","footnotes":""},"categories":[10],"tags":[48,90],"class_list":["post-702","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-delphi","tag-cloud","tag-delphi"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3 | Andreano Lanusse | Technology and Software Development<\/title>\n<meta name=\"description\" content=\"Compile Delphi code for 64-bit platform is possible now with Delphi XE2 and XE3, developers can go beyond Windows 32-bit and start creating Windows Shell\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3 | Andreano Lanusse | Technology and Software Development\" \/>\n<meta property=\"og:description\" content=\"Compile Delphi code for 64-bit platform is possible now with Delphi XE2 and XE3, developers can go beyond Windows 32-bit and start creating Windows Shell\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Technology and Software Development\" \/>\n<meta property=\"article:published_time\" content=\"2012-11-14T23:37:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-12-28T08:34:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png\" \/>\n\t<meta property=\"og:image:width\" content=\"170\" \/>\n\t<meta property=\"og:image:height\" content=\"170\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Andreano Lanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andreano Lanusse\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/\"},\"author\":{\"name\":\"Andreano Lanusse\",\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b\"},\"headline\":\"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3\",\"datePublished\":\"2012-11-14T23:37:55+00:00\",\"dateModified\":\"2012-12-28T08:34:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/\"},\"wordCount\":839,\"commentCount\":7,\"publisher\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b\"},\"image\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png\",\"keywords\":[\"Cloud\",\"Delphi\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"en\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/\",\"url\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/\",\"name\":\"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3 | Andreano Lanusse | Technology and Software Development\",\"isPartOf\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png\",\"datePublished\":\"2012-11-14T23:37:55+00:00\",\"dateModified\":\"2012-12-28T08:34:23+00:00\",\"description\":\"Compile Delphi code for 64-bit platform is possible now with Delphi XE2 and XE3, developers can go beyond Windows 32-bit and start creating Windows Shell\",\"breadcrumb\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#breadcrumb\"},\"inLanguage\":\"en\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en\",\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage\",\"url\":\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png\",\"width\":170,\"height\":170},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/www.andreanolanusse.com\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#website\",\"url\":\"https:\/\/www.andreanolanusse.com\/en\/\",\"name\":\"Andreano Lanusse | Technology and Software Development\",\"description\":\"Where Andreano Lanusse talk about technology, software development, programming techniques, databases, games and more through articles, tutorials and videos\",\"publisher\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.andreanolanusse.com\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en\",\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/49ab23ef70c249c0cb3469f14ef07edc?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/49ab23ef70c249c0cb3469f14ef07edc?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/image\/\"},\"description\":\"Andreano Lanusse is an expert and enthusiastic on software development industry, at Embarcadero he is focused on helping to make sure the products being developed meet the expectations of Embarcadero's customers, as well as defining market strategies for Latin America. Today as Latin Lead Evangelist he spends great deal of time in developer conferences, tradeshows, user group, and visiting customers throughout Latin America. Before Embarcadero, he worked 13 years for Borland, Andreano has worked as Support Coordinator, Engineer, Product Manager, including Product Line Sales Manager, where was responsible to manage the relationship with Brazil developer community, also has worked as Principal Consultant for Borland Consulting Services on the development and management of critical applications. He previously served as Chief Architect for USS Solu\u00e7\u00f5es Gerenciadas (now USS Tempo). Andreano holds a bachelor's degree in Business Administration Marketing Emphasis from Sumare Institute, MBA in Project Management from FGV, certification in Microsoft products, all Borland ALM products, and all CodeGear product line.\",\"sameAs\":[\"http:\/\/www.andreanolanusse.com\",\"https:\/\/x.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3 | Andreano Lanusse | Technology and Software Development","description":"Compile Delphi code for 64-bit platform is possible now with Delphi XE2 and XE3, developers can go beyond Windows 32-bit and start creating Windows Shell","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:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/","og_locale":"en_US","og_type":"article","og_title":"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3 | Andreano Lanusse | Technology and Software Development","og_description":"Compile Delphi code for 64-bit platform is possible now with Delphi XE2 and XE3, developers can go beyond Windows 32-bit and start creating Windows Shell","og_url":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/","og_site_name":"Andreano Lanusse | Technology and Software Development","article_published_time":"2012-11-14T23:37:55+00:00","article_modified_time":"2012-12-28T08:34:23+00:00","og_image":[{"width":170,"height":170,"url":"https:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png","type":"image\/png"}],"author":"Andreano Lanusse","twitter_misc":{"Written by":"Andreano Lanusse","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#article","isPartOf":{"@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/"},"author":{"name":"Andreano Lanusse","@id":"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b"},"headline":"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3","datePublished":"2012-11-14T23:37:55+00:00","dateModified":"2012-12-28T08:34:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/"},"wordCount":839,"commentCount":7,"publisher":{"@id":"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b"},"image":{"@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage"},"thumbnailUrl":"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png","keywords":["Cloud","Delphi"],"articleSection":["Delphi"],"inLanguage":"en","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/","url":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/","name":"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3 | Andreano Lanusse | Technology and Software Development","isPartOf":{"@id":"https:\/\/www.andreanolanusse.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage"},"image":{"@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage"},"thumbnailUrl":"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png","datePublished":"2012-11-14T23:37:55+00:00","dateModified":"2012-12-28T08:34:23+00:00","description":"Compile Delphi code for 64-bit platform is possible now with Delphi XE2 and XE3, developers can go beyond Windows 32-bit and start creating Windows Shell","breadcrumb":{"@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#breadcrumb"},"inLanguage":"en","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/"]}]},{"@type":"ImageObject","inLanguage":"en","@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#primaryimage","url":"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png","contentUrl":"http:\/\/www.andreanolanusse.com\/en\/wp-content\/uploads\/2011\/07\/Icon_Delphi.png","width":170,"height":170},{"@type":"BreadcrumbList","@id":"https:\/\/www.andreanolanusse.com\/en\/shell-extension-for-windows-32-bit-and-64-bit-with-delphi-xe2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/www.andreanolanusse.com\/en\/"},{"@type":"ListItem","position":2,"name":"Shell Extension for Windows 32-bit and 64-bit with Delphi XE2 or XE3"}]},{"@type":"WebSite","@id":"https:\/\/www.andreanolanusse.com\/en\/#website","url":"https:\/\/www.andreanolanusse.com\/en\/","name":"Andreano Lanusse | Technology and Software Development","description":"Where Andreano Lanusse talk about technology, software development, programming techniques, databases, games and more through articles, tutorials and videos","publisher":{"@id":"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.andreanolanusse.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en"},{"@type":["Person","Organization"],"@id":"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/b51fdf99c01fcd6ae0a5ae894c23837b","name":"Andreano Lanusse","image":{"@type":"ImageObject","inLanguage":"en","@id":"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/49ab23ef70c249c0cb3469f14ef07edc?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/49ab23ef70c249c0cb3469f14ef07edc?s=96&d=mm&r=g","caption":"Andreano Lanusse"},"logo":{"@id":"https:\/\/www.andreanolanusse.com\/en\/#\/schema\/person\/image\/"},"description":"Andreano Lanusse is an expert and enthusiastic on software development industry, at Embarcadero he is focused on helping to make sure the products being developed meet the expectations of Embarcadero's customers, as well as defining market strategies for Latin America. Today as Latin Lead Evangelist he spends great deal of time in developer conferences, tradeshows, user group, and visiting customers throughout Latin America. Before Embarcadero, he worked 13 years for Borland, Andreano has worked as Support Coordinator, Engineer, Product Manager, including Product Line Sales Manager, where was responsible to manage the relationship with Brazil developer community, also has worked as Principal Consultant for Borland Consulting Services on the development and management of critical applications. He previously served as Chief Architect for USS Solu\u00e7\u00f5es Gerenciadas (now USS Tempo). Andreano holds a bachelor's degree in Business Administration Marketing Emphasis from Sumare Institute, MBA in Project Management from FGV, certification in Microsoft products, all Borland ALM products, and all CodeGear product line.","sameAs":["http:\/\/www.andreanolanusse.com","https:\/\/x.com\/andreanolanusse"]}]}},"_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/posts\/702","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/comments?post=702"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/posts\/702\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/media\/797"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/media?parent=702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/categories?post=702"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/en\/wp-json\/wp\/v2\/tags?post=702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}