IInternetSecurityManager and SetZoneMapping SIGSEGV lazarus / 34-Windows ---------------------------------------------------------------------- ispanec · 2015-11-19 14:02 Hello everyone! I try to add site in Trusted Zone (Internet Explorer) using IInternetSecurityManager interface and method SetZoneMapping https://msdn.microsoft.com/en-us/library/ms537143%28v=vs.85%29.aspx C++ example: https://technet.microsoft.com/en-us/ms537181 My test code: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i program TrustedSite; {$mode objfpc}{$H+} uses  {$IFDEF UNIX}{$IFDEF UseCThreads}  cthreads,  {$ENDIF}{$ENDIF}  Classes, activex, windows  { you can add units after this }; type  IInternetSecurityManager = interface(IUnknown)['{79eac9ee-baf9-11ce-8c82-00aa004ba90b}']  function SetZoneMapping(dwZone: DWORD; lpszPattern: LPCWSTR; dwFlags: DWORD): HResult; stdcall;end;   //function CoInternetCreateSecurityManager(sp: IServiceProvider; var ppSM: IInternetSecurityManager; dwReserved: DWORD): HRESULT;  //stdcall; external 'urlmon.dll';  const  //CLSID_InternetSecurityManager: TGUID = '{79eac9ee-baf9-11ce-8c82-00aa004ba90b}';  CLSID_InternetSecurityManager: TGUID = '{7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4}';  IID_IInternetSecurityManager: TGUID = '{79eac9ee- baf9-11ce-8c82-00aa004ba90b}';   URLZONE_ESC_FLAG         = $100;  URLZONE_LOCAL_MACHINE    = 0;  URLZONE_INTRANET         = URLZONE_LOCAL_MACHINE + 1;  URLZONE_TRUSTED          = URLZONE_INTRANET + 1;  URLZONE_INTERNET         = URLZONE_TRUSTED + 1;  URLZONE_UNTRUSTED        = URLZONE_INTERNET + 1;  URLZONE_PREDEFINED_MIN   = 0;  URLZONE_PREDEFINED_MAX   = 999;  URLZONE_USER_MIN         = 1000;  URLZONE_USER_MAX         = 10000;   SZM_CREATE = 0;  SZM_DELETE = 1;  var  pResult:HRESULT;  pInternetSecurityManager:IInternetSecurityManager;begin   WriteLn('Try Create Instance');   CoInitialize(nil);   pResult := CoCreateInstance( CLSID_InternetSecurityManager,                               nil,                             CLSCTX_ALL, //CLSCTX_INPROC_SERVER                             IID_IInternetSecurityManager,                             pInternetSecurityManager );   if (Failed(pResult)) then begin      WriteLn('Failed Create Instance');      ReadLn();    Exit;  end;   WriteLn('Instance Created');    pResult :=  pInternetSecurityManager.SetZoneMapping(URLZONE_ESC_FLAG or URLZONE_TRUSTED,                                          PWideChar(WideString('http://msdn.microsoft.com')), //StringToOleStr('http://msdn.microsoft.com'),                                        SZM_CREATE);     CoUninitialize();    {if CoInternetCreateSecurityManager(nil, pInternetSecurityManager, 0) = S_OK then begin     pInternetSecurityManager.SetZoneMapping(URLZONE_ESC_FLAG or URLZONE_TRUSTED,                                             PWideChar(WideString('http://msdn.microsoft.com')),                                           SZM_CREATE);     WriteLn('End');  end;      }   WriteLn('End');  ReadLn();end.  pInternetSecurityManager created, but pInternetSecurityManager.SetZoneMapping generate external SIGSEGV If i use CoInternetCreateSecurityManager there is the same error on call pInternetSecurityManager.SetZoneMapping How to avoid this error? ---------------------------------------------------------------------- marcov · 2015-11-19 14:30 You specify that there is only one method in this interface, while MSDN says there are more ---------------------------------------------------------------------- ChrisF · 2015-11-19 15:28 I agree with marcov. Use the full interface definition: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i type  IInternetSecurityMgrSite = interface    ['{79eac9ed- baf9-11ce-8c82-00aa004ba90b}']    function GetWindow(out hwnd: HWnd): HResult; stdcall;    function EnableModeless(fEnable: BOOL): HResult; stdcall;  end;   IInternetSecurityManager = interface    ['{79eac9ee- baf9-11ce-8c82-00aa004ba90b}']    function SetSecuritySite(Site: IInternetSecurityMgrSite): HResult; stdcall;    function GetSecuritySite(out Site: IInternetSecurityMgrSite): HResult; stdcall;    function MapUrlToZone(pwszUrl: LPCWSTR; out dwZone: DWORD;      dwFlags: DWORD): HResult; stdcall;    function GetSecurityId(pwszUrl: LPCWSTR; pbSecurityId: Pointer;      var cbSecurityId: DWORD; dwReserved: DWORD): HResult; stdcall;    function ProcessUrlAction(pwszUrl: LPCWSTR; dwAction: DWORD;      pPolicy: Pointer; cbPolicy: DWORD; pContext: Pointer; cbContext: DWORD;      dwFlags, dwReserved: DWORD): HResult; stdcall;    function QueryCustomPolicy(pwszUrl: LPCWSTR; const guidKey: TGUID;      out pPolicy: Pointer; out cbPolicy: DWORD; pContext: Pointer; cbContext: DWORD;      dwReserved: DWORD): HResult; stdcall;    function SetZoneMapping(dwZone: DWORD; lpszPattern: LPCWSTR;      dwFlags: DWORD): HResult; stdcall;    function GetZoneMappings(dwZone: DWORD; out enumString: IEnumString;      dwFlags: DWORD): HResult; stdcall;  end; However, there is still a crash when the program ended; probably something else wrong/incomplete ... ---------------------------------------------------------------------- ispanec · 2015-11-19 17:25 marcov, ChrisF, you are right, i had to specify all methods! QuoteHowever, there is still a crash when the program ended; probably something else wrong/incomplete ...Need to free resources pInternetSecurityManager := nil or use CoInternetCreateSecurityManager It's work on Windows 7 and IE 11. CoCreateInstance: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i program TrustedSite; {$mode objfpc}{$H+} uses  {$IFDEF UNIX}{$IFDEF UseCThreads}  cthreads,  {$ENDIF}{$ENDIF}  Classes, activex, windows  { you can add units after this }; type  IInternetSecurityMgrSite = interface(IUnknown)    ['{79eac9ed-baf9-11ce-8c82-00aa004ba90b}']    function GetWindow(out hwnd: HWnd): HResult; stdcall;    function EnableModeless(fEnable: BOOL): HResult; stdcall;  end;   IInternetSecurityManager = interface(IUnknown)    ['{79eac9ee- baf9-11ce-8c82-00aa004ba90b}']    function SetSecuritySite(Site: IInternetSecurityMgrSite): HResult; stdcall;    function GetSecuritySite(out Site: IInternetSecurityMgrSite): HResult; stdcall;    function MapUrlToZone(pwszUrl: LPCWSTR; out dwZone: DWORD;      dwFlags: DWORD): HResult; stdcall;    function GetSecurityId(pwszUrl: LPCWSTR; pbSecurityId: Pointer;      var cbSecurityId: DWORD; dwReserved: DWORD): HResult; stdcall;    function ProcessUrlAction(pwszUrl: LPCWSTR; dwAction: DWORD;      pPolicy: Pointer; cbPolicy: DWORD; pContext: Pointer; cbContext: DWORD;      dwFlags, dwReserved: DWORD): HResult; stdcall;    function QueryCustomPolicy(pwszUrl: LPCWSTR; const guidKey: TGUID;      out pPolicy: Pointer; out cbPolicy: DWORD; pContext: Pointer; cbContext: DWORD;      dwReserved: DWORD): HResult; stdcall;    function SetZoneMapping(dwZone: DWORD; lpszPattern: LPCWSTR;      dwFlags: DWORD): HResult; stdcall;    function GetZoneMappings(dwZone: DWORD; out enumString: IEnumString;      dwFlags: DWORD): HResult; stdcall;  end;  const  //CLSID_InternetSecurityManager: TGUID = '{79eac9ee- baf9-11ce-8c82-00aa004ba90b}';  CLSID_InternetSecurityManager: TGUID = '{7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4}';  IID_IInternetSecurityManager: TGUID = '{79eac9ee- baf9-11ce-8c82-00aa004ba90b}';   URLZONE_ESC_FLAG         = $100;  URLZONE_LOCAL_MACHINE    = 0;  URLZONE_INTRANET         = URLZONE_LOCAL_MACHINE + 1;  URLZONE_TRUSTED          = URLZONE_INTRANET + 1;  URLZONE_INTERNET         = URLZONE_TRUSTED + 1;  URLZONE_UNTRUSTED        = URLZONE_INTERNET + 1;  URLZONE_PREDEFINED_MIN   = 0;  URLZONE_PREDEFINED_MAX   = 999;  URLZONE_USER_MIN         = 1000;  URLZONE_USER_MAX         = 10000;   SZM_CREATE = 0;  SZM_DELETE = 1; var  pResult:HRESULT;  pInternetSecurityManager:IInternetSecurityManager;begin    WriteLn('Try Create Instance');   CoInitialize(nil);   pResult := CoCreateInstance( CLSID_InternetSecurityManager,                             nil,                               CLSCTX_ALL, //CLSCTX_INPROC_SERVER                               IID_IInternetSecurityManager,                               pInternetSecurityManager );   if (Failed(pResult)) then begin      WriteLn('Failed Create Instance');      ReadLn();    Exit;  end;   WriteLn('Instance Created');   pResult :=  pInternetSecurityManager.SetZoneMapping(URLZONE_TRUSTED, //URLZONE_ESC_FLAG or                                          PWideChar(WideString('https://msdn.microsoft.com')),                                        SZM_CREATE);    pInternetSecurityManager := nil;  //pInternetSecurityManager._Release;  CoUninitialize();   WriteLn('End');  ReadLn(); end.  CoInternetCreateSecurityManager: Code: Pascal  [Select][+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i program TrustedSite; {$mode objfpc}{$H+} uses  {$IFDEF UNIX}{$IFDEF UseCThreads}  cthreads,  {$ENDIF}{$ENDIF}  Classes, activex, windows  { you can add units after this }; type  IInternetSecurityMgrSite = interface(IUnknown)    ['{79eac9ed-baf9-11ce-8c82-00aa004ba90b}']    function GetWindow(out hwnd: HWnd): HResult; stdcall;    function EnableModeless(fEnable: BOOL): HResult; stdcall;  end;   IInternetSecurityManager = interface(IUnknown)    ['{79eac9ee- baf9-11ce-8c82-00aa004ba90b}']    function SetSecuritySite(Site: IInternetSecurityMgrSite): HResult; stdcall;    function GetSecuritySite(out Site: IInternetSecurityMgrSite): HResult; stdcall;    function MapUrlToZone(pwszUrl: LPCWSTR; out dwZone: DWORD;      dwFlags: DWORD): HResult; stdcall;    function GetSecurityId(pwszUrl: LPCWSTR; pbSecurityId: Pointer;      var cbSecurityId: DWORD; dwReserved: DWORD): HResult; stdcall;    function ProcessUrlAction(pwszUrl: LPCWSTR; dwAction: DWORD;      pPolicy: Pointer; cbPolicy: DWORD; pContext: Pointer; cbContext: DWORD;      dwFlags, dwReserved: DWORD): HResult; stdcall;    function QueryCustomPolicy(pwszUrl: LPCWSTR; const guidKey: TGUID;      out pPolicy: Pointer; out cbPolicy: DWORD; pContext: Pointer; cbContext: DWORD;      dwReserved: DWORD): HResult; stdcall;    function SetZoneMapping(dwZone: DWORD; lpszPattern: LPCWSTR;      dwFlags: DWORD): HResult; stdcall;    function GetZoneMappings(dwZone: DWORD; out enumString: IEnumString;      dwFlags: DWORD): HResult; stdcall;  end;   function CoInternetCreateSecurityManager(sp: IServiceProvider; var ppSM: IInternetSecurityManager; dwReserved: DWORD): HRESULT;  stdcall; external 'urlmon.dll'; const  //CLSID_InternetSecurityManager: TGUID = '{79eac9ee- baf9-11ce-8c82-00aa004ba90b}';  CLSID_InternetSecurityManager: TGUID = '{7b8a2d94-0ac9-11d1-896c-00c04fb6bfc4}';  IID_IInternetSecurityManager: TGUID = '{79eac9ee- baf9-11ce-8c82-00aa004ba90b}';   URLZONE_ESC_FLAG         = $100;  URLZONE_LOCAL_MACHINE    = 0;  URLZONE_INTRANET         = URLZONE_LOCAL_MACHINE + 1;  URLZONE_TRUSTED          = URLZONE_INTRANET + 1;  URLZONE_INTERNET         = URLZONE_TRUSTED + 1;  URLZONE_UNTRUSTED        = URLZONE_INTERNET + 1;  URLZONE_PREDEFINED_MIN   = 0;  URLZONE_PREDEFINED_MAX   = 999;  URLZONE_USER_MIN         = 1000;  URLZONE_USER_MAX         = 10000;   SZM_CREATE = 0;  SZM_DELETE = 1; var  pResult:HRESULT;  pInternetSecurityManager:IInternetSecurityManager;begin    if CoInternetCreateSecurityManager(nil, pInternetSecurityManager, 0) = S_OK then begin     WriteLn('Internet Security Manager Created');      pResult := pInternetSecurityManager.SetZoneMapping(URLZONE_TRUSTED,  //URLZONE_ESC_FLAG or                                             PWideChar(WideString('https://msdn.microsoft.com')),                                           SZM_CREATE);      if (pResult = 0) then      WriteLn('Site added to trusted');   end;   WriteLn('End');  ReadLn();end.           URLZONE_ESC_FLAG or URLZONE_TRUSTED it does not add to trusted sites, use only URLZONE_TRUSTED Thanks again for your help!