| 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 |
#2 · Zasláno: 12. 10. 2009, 00:18:52
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 |
#3 · Zasláno: 12. 10. 2009, 14:58:39 · Upravil/a: tanned88
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 |
#4 · Zasláno: 12. 10. 2009, 15:30:00
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 |
#5 · Zasláno: 12. 10. 2009, 15:33:15
tanned88:
Tuším že komponenty se registrují přes regsvr32 nebo tak nějak... |
||
| tanned88 Profil |
#6 · Zasláno: 12. 10. 2009, 16:15:41
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 |
#7 · Zasláno: 12. 10. 2009, 16:26:48
Reaguji na tanneda88:
Uživatelům by se taková varianta pochopitelně nelíbila. |
||
| tanned88 Profil |
#8 · Zasláno: 13. 10. 2009, 20:16:15 · Upravil/a: tanned88
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 |
#9 · Zasláno: 13. 10. 2009, 20:21:55
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 |
#10 · Zasláno: 13. 10. 2009, 20:35:49
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 |
#11 · Zasláno: 14. 10. 2009, 00:31:10
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. |
||
|
Časová prodleva: 16 let
|
|||
0