this cevabını tam olarak takip ettim ve tüm google bulgularını okudum ve okudum. Ne yazık ki çoğunlukla bunların hepsi sadece başvurulan cevabın kopyasını ve yapıştırmalarını ('Kafanızı duvara çarpmayı bırak ve kutla!') Dahil olmak üzere ve benim için işe yaramıyor ... Bu yüzden yarım gün çalışıyorum kafamı becermeye başlamak üzereyim…Javascript'ten C# BHO yöntemlerini çağırmak (hala çalışmıyor)
Basit hatam: javascript windows.myExtension nesnesi 'undefined', bu yüzden Foo çağırmak hata veriyor. Aşağıdaki tam kaynağa bakın. Özellik kümesi javascript tarafında görüntülenemez gibi görünüyor.
Bazı daha fazla bilgi:
- benim uzantısı hata ayıklamak için uygun bir yol Debugger.Launch() deyimini kullanır ve kesme isabet ve tüm BHO uzatma düzgün denilen ve çalışma vardır.
yorumlar alternatif (property.SetProperty ile) de aynı hata ile çalışmaz:
console.log (window.myExtension); // 'undefined' yazıyor, neden?
: VS 2010, Windows 7 x64 kullanma<!DOCTYPE html> <html> <head> <script type="text/javascript"> console.log(window.myExtension); // Writes undefined why? It should be an object... var result = window.myExtension.Foo("bar"); // Obviously throws and error if window.myExtension is undefined </script> <title></title> </head> <body> </body> </html>
IE 9
beni
basit bir test sayfası önceden bu ... Thx çalışan yardım edelim
BrowserHelperObject.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.Expando;
using Microsoft.Win32;
using SHDocVw;
namespace IEExtensionTest
{
[ComVisible(true)]
[Guid("DA8EA345-02AE-434E-82E9-448E3DB7629E")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("MyExtension")]
[ComDefaultInterface(typeof(IExtension))]
public class BrowserHelperObject : IObjectWithSite, IExtension
{
private WebBrowser webBrowser;
public int Foo(string s)
{
return 0;
}
public void OnDocumentComplete(dynamic frame, ref dynamic url)
{
Debugger.Launch();
dynamic window = webBrowser.Document.parentWindow;
var windowEx = (IExpando)window;
windowEx.AddProperty("myExtension");
window.myExtension = this;
//var property = windowEx.AddProperty("MyExtension");
//property.SetValue(windowEx, this, null);
}
public static string BHOKEYNAME = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
[ComRegisterFunction]
public static void RegisterBHO(Type type)
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);
if (registryKey == null)
registryKey = Registry.LocalMachine.CreateSubKey(BHOKEYNAME);
string guid = type.GUID.ToString("B");
RegistryKey ourKey = registryKey.OpenSubKey(guid);
if (ourKey == null)
ourKey = registryKey.CreateSubKey(guid);
ourKey.SetValue("Alright", 1);
registryKey.Close();
ourKey.Close();
}
[ComUnregisterFunction]
public static void UnregisterBHO(Type type)
{
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BHOKEYNAME, true);
string guid = type.GUID.ToString("B");
if (registryKey != null)
registryKey.DeleteSubKey(guid, false);
}
public int SetSite(object site)
{
if (site != null)
{
webBrowser = (WebBrowser)site;
webBrowser.DocumentComplete += OnDocumentComplete;
}
else
{
webBrowser.DocumentComplete -= OnDocumentComplete;
webBrowser = null;
}
return 0;
}
public int GetSite(ref Guid guid, out IntPtr ppvSite)
{
IntPtr punk = Marshal.GetIUnknownForObject(webBrowser);
int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
Marshal.Release(punk);
return hr;
}
}
IObjectWithSite.cs
using System;
using System.Runtime.InteropServices;
namespace IEExtensionTest
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
public interface IObjectWithSite
{
[PreserveSig]
int SetSite([MarshalAs(UnmanagedType.IUnknown)] object site);
[PreserveSig]
int GetSite(ref Guid guid, out IntPtr ppvSite);
}
}
IExtension.cs
izler (ve düzgün çalışır) olarak Mesaj yapı adım yapılandırıldığıusing System;
using System.Runtime.InteropServices;
namespace IEExtensionTest
{
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")]
public interface IObjectWithSite
{
[PreserveSig]
int SetSite([MarshalAs(UnmanagedType.IUnknown)] object site);
[PreserveSig]
int GetSite(ref Guid guid, out IntPtr ppvSite);
}
}
:
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe" /f /i "$(TargetDir)$(TargetFileName)"
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" /unregister "$(TargetDir)$(TargetFileName)"
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "$(TargetDir)$(TargetFileName)"
Sadece bu bir bıçak alarak, ama buna sadece ekler gibi görünüyor 'myExtension Belge tamamlandı. Bu hack testini deneyin: 'setTimeout (function() {console.log (window.myExtension);}, 1000);' 1 saniye sonra konsola bir şey çıkarmalı. Bu noktada, belge yüklenmeli ve cevabınızı almalısınız. Lütfen bu testten sonra tekrar rapor verin. Fikriniz için –
Thx. Çoktan denedim ve şimdi tekrar. Zamanlama problemi değil. window.myExtension, gecikmeli çağrıda hala tanımlanmamış :-( –
@Dalorzo Lütfen gerekli olmayan etiketler eklemek gibi önemsiz düzenlemelerle durun. Geçmişinize göz attım ve en son önerilen düzenlemelerinizin çoğu reddedilmiş olmalıdır. Bu türden önemsiz (ve genellikle yanlış ve/veya eksik) düzenlemeler yaparak eski soruları gereksiz yere çarpar hale getiriyorlardı .. –