Autor Zpráva
tanned88
Profil
Ahoj, celkem hodně dlouho sem hledal na internetu a nenašel téměř nic. Co potřebuju?, abych mohl pracovat s objekty a třídami z DLL (vytvořené v c#) na webové stránce pomocí JavaScript-u.
Co jsem teda zplichtil:
<script type="text/javascript">
    var obj = new ActiveXObject("myDLL.myClass");
    document.write(obj.Pozdrav("Ludvík"));
</script>



A obsah myDLL.dll (c#)
namespace myDLL
{
    [ComVisible (true),
    Guid("e43077ec-53b4-4cd3-84f8-4e147d13c18c"),
    ProgId("myClassLibrary.myDLL"),
    ClassInterface(ClassInterfaceType.None)] 

    public class myClass
    {
        public string Pozdrav(string name)
        {
        return "Hello " + name;
        }
    }
}


Děkuji za vaše rady :)
EDIT: a sory za Jana - samozrejme Java ;)
Chamurappi
Profil
Reaguji na tanneda88:
Nevím, jak je to u .NETových udělátek, ale u obyčejného ActiveX objektu platí, že musí být v systému nainstalovaný jako „Safe for Scripting“, jinak ti Explorer nedovolí ho inicializovat.

new ActiveXObject("myDLL.myClass");
ProgId("myClassLibrary.myDLL")
Neměly by být tyto dva řetězce stejné?
tanned88
Profil
Děkuji za reakci,
co jsem se docetl tak by to neměl být MFC ale COM a ten se musí zaregistrovart (v tomhle jsem hrozna lama takze promin, pokud kecam srac.. kraviny) asi stejně nebo nvm jak.

"Neměly by být tyto dva řetězce stejné?"

mno to by asi měli :)

aa... tuhle bezpečnostní závoru a registrace komponenty, jde napsat v JS?, protože já nedělám server-ovej projekt, ale stránku která by měla být přenositelná jako aplikace :)
Chamurappi
Profil
Reaguji na tanneda88:
tuhle bezpečnostní závoru a registrace komponenty, jde napsat v JS?
Nejde to z prostředí webové stránky. To by jinak nebyla moc účinná bezpečnostní závora.
Joker
Profil
tanned88:
Tuším že komponenty se registrují přes regsvr32 nebo tak nějak...
tanned88
Profil
to jsem již taky zjistil... ale jak.. jde to příkazem přez CMD ale mě by se právě líbyla varianta, kde by se ten příkaz provedl rovnou z stránky tedy JavaScriptem.. poku to vůbec jde udělat bez vědomí uživatele..
Chamurappi
Profil
Reaguji na tanneda88:
Uživatelům by se taková varianta pochopitelně nelíbila.
tanned88
Profil
Ahoj, tak jsem o5 zde s novinkami (jsem rád že mi to pomáhá někdo vyřešit :) ).

Kdesi v hlubinách internetu jsem nalezl toto: http://thestargate.7u.cz/soubory/interop.js

Jde o JScript, který by měl zajistit zaregisrování knihovny. JS kód na stránkách pak vypadal takhle:
regRoot = "c:/sd/s/asd/s.dll";
comNSpc = "myDLL"; 
comCls = "myClass"; 



dllOK.Pozdrav("Jarda"); už nefungoval, myslím proto, že se vůbec DLL nezaregistrovala a nevytvořil se ani ActiveX objek, avšak ošetřená víjmka v interob.js nějak nekolidovala. Tak nevím, čím by to mohlo být, dá se nějak postupně zjistit, kde nsatala chyba?
Chamurappi
Profil
Reaguji na tanneda88:
dá se nějak postupně zjistit, kde nsatala chyba?
Z nefunkčního odkazu na interop.js, ze tří řetězců a z tvého popisu? Nedá.

Jde o JScript, který by měl zajistit zaregisrování knihovny.
Žádný skript běžící na webové stránce nemůže zaregistrovat knihovnu. Mohl by to udělat nanejvýš skript pro WSH.
tanned88
Profil
Tak to bylo trochu neůplné mno a malá chyba :), tak tedy:

Stránka:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <script type="text/javascript" src="interop.js" ></script>
</head>
<body>
<script type="text/javascript">
regRoot = "c:/neco/neco/myDLL.dll";
comNSpc = "myDLL"; 
comCls = "myClass"; 
document.write(myDLL.Pozdrav("Chamurappi"));
</script>
</body>
</html>



a dll v c#:
namespace myDLL
{
    [ComVisible (true),
    Guid("e43077ec-53b4-4cd3-84f8-4e147d13c18c"),
    ProgId("myDLL.myClass"),
    ClassInterface(ClassInterfaceType.None)] 

    public class myClass
    {
        public string Pozdrav(string name)
        {
        return "Hello " + name;
        }
    }
}



a aby to bylo úplné tak obsah interop.js:
/* -------------------------------------------
   - Interop Services for Registering DLLs on
   - the fly.
   -------------------------------------------*/    
var axDllVersion = "1.0.0.0";
var axDllRuntimeVer = "v2.0.50727";
var regRoot, dllOK, myDLL;         
function activateDLL(root)
{
    regRoot = root;
    try
    {
        RegisterDLL();
        myDLL = new ActiveXObject(comNSpc + "." + comCls);
        dllOK = true;
    } 
    catch (err) 
    {
       myDLL = null;
       dllOK = false;
       UnregisterDLL();
    }
    return dllOK;
}         
        
function RegisterDLL()
{
    var oShell = new ActiveXObject("WScript.Shell");
    try
    {
        var classRoot = regRoot + "\\Software\\Classes\\" + comNSpc + "." + comCls + "\\";
        var clsidRoot = regRoot + "\\Software\\Classes\\CLSID\\" + "{" + comGuid + "}" + "\\";
        var dllPath = System.Gadget.path.replace(RegExp("\\\\", "g"), "/") + "/binaries/" + comNSpc + ".dll";
        oShell.RegWrite(classRoot, comNSpc + "." + comCls, "REG_SZ");
        oShell.RegWrite(classRoot + "CLSID\\", "{" + comGuid + "}", "REG_SZ");
        oShell.RegWrite(clsidRoot, comNSpc + "." + comCls, "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\", "mscoree.dll", "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\ThreadingModel", "Both", "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\Class", comNSpc + "." + comCls, "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\Assembly", comNSpc + ", Version=" + axDllVersion + ", Culture=neutral, PublicKeyToken=null", "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\RuntimeVersion", axDllRuntimeVer, "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\CodeBase", "file:///" + dllPath, "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\" + axDllVersion + "\\Class", comNSpc + "." + comCls, "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\" + axDllVersion + "\\Assembly", comNSpc + ", Version=" + axDllVersion + ", Culture=neutral, PublicKeyToken=null", "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\" + axDllVersion + "\\RuntimeVersion", axDllRuntimeVer, "REG_SZ");
        oShell.RegWrite(clsidRoot + "InprocServer32\\" + axDllVersion + "\\CodeBase", "file:///" + dllPath, "REG_SZ");
        oShell.RegWrite(clsidRoot + "ProgId\\", comNSpc + "." + comCls, "REG_SZ");
        oShell.RegWrite(clsidRoot + "ProgId\\Implemented Categories\\{e43077ec-53b4-4cd3-84f8-4e147d13c18c}\\", "", "REG_SZ");
    }
    catch (err) 
    {
       	prompt("E R R O R", "RegisterDLL: " + err.name + " - " + err.message)
    }

}
function UnregisterDLL()
{
    var oShell = new ActiveXObject("WScript.Shell");
    var classRoot = regRoot + "\\Software\\Classes\\" + comNSpc + "." + comCls + "\\";
    var clsidRoot = regRoot + "\\Software\\Classes\\CLSID\\" + "{" + comGuid + "}" + "\\";
    try
    {
    	oShell.RegDelete(clsidRoot + "ProgId\\Implemented Categories\\{e43077ec-53b4-4cd3-84f8-4e147d13c18c}\\");
        oShell.RegDelete(clsidRoot + "ProgId\\Implemented Categories\\");
        oShell.RegDelete(clsidRoot + "ProgId\\");
        oShell.RegDelete(clsidRoot + "InprocServer32\\" + axDllVersion + "\\");
        oShell.RegDelete(clsidRoot + "InprocServer32\\");
        oShell.RegDelete(clsidRoot);
        oShell.RegDelete(classRoot + "CLSID\\");
        oShell.RegDelete(classRoot);
    }
    catch (err) 
    {
    	prompt("E R R O R", "UnregisterDLL: " + err.name + " - " + err.message)
    }
}   


A ani to není moc velké ;)
Chamurappi
Profil
Reaguji na tanneda88:
new ActiveXObject("WScript.Shell");
Pokud vím, tak WScript.Shell je součástí WSH a není „safe for scripting“, tudíž ho v prostředí webové stránky nemůžeš vytvořit. Tvůj interop.js je skript pro WSH

var dllPath = System.Gadget.path.replace
… nebo možná spíš součast gadgetu pro Vistu.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: