[C#]ActiveX控件调用页面上的JavaScript

项目需要开发一个ActiveX控件,前台客户端和页面端同时使用,在开发的过程中,需求有所改进,从单纯的展示到需要与后台进行交互,为了让控件能直接通过页面访问后台,需要在控件中调用页面的js,实验多次(网上不靠谱的太多了,尼玛,坑爹不偿命啊!)后,总结如下:


1.在项目中添加2个接口类文件,IOleClientSite接口和IOleContainer接口,两个接口的Guid貌似不能改,直接复制粘贴即可:

using System.Runtime.InteropServices;

[ComImport,
 Guid("00000118-0000-0000-C000-000000000046"),
 InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleClientSite
 {
void SaveObject();
void GetMoniker(uint dwAssign, uint dwWhichMoniker, object ppmk);
void GetContainer(out IOleContainer ppContainer);
void ShowObject();
void OnShowWindow(bool fShow);
void RequestNewObjectLayout();
 }


using System.Runtime.InteropServices;
[ComImport,
 Guid("0000011B-0000-0000-C000-000000000046"),
 InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleContainer
 {
void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags,
 [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum);
void ParseDisplayName([In, MarshalAs(UnmanagedType.Interface)] object pbc,
 [In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName,
 [Out, MarshalAs(UnmanagedType.LPArray)] int[] pchEaten,
 [Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut);
void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock);
 }


 2.在ActiveX控件中调用方法,首先需要引用Microsoft.mshtml,在项目中引用-添加引用,在.Net组件中找到Microsoft.mshtml即可 

在控件的主文件中,添加对Microsoft.mshtml的引用:

using mshtml; //注意命名空间只有这个,没有前面的Microsoft

接下来在控件中添加一个方法,这里采用了一个string类型的参数,这样在控件需要调用JS的地方调用这个方法即可。

private void CallJS(string text)
{
  Type typeIOleObject = this.GetType().GetInterface("IOleObject",true); 
  object oleClientSite = typeIOleObject.InvokeMember("GetClientSite",
  BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,null,this,null); 

  IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite;
  IOleContainer pObj;
  oleClientSite2.GetContainer(out pObj);

 //参数数组
 object[] args = new object[]{text};//调用js时传过去的参数,有多个就加到这里可以

 //获取页面的Script集合
 IHTMLDocument pDoc2 = (IHTMLDocument)pObj;
 object script = pDoc2.Script;

 try
 {
   //调用JavaScript方法MyMethod并传递参数,因为此方法可能并没有在页面中实现,所以要进行异常处理
   script.GetType().InvokeMember("MyMethod",
   BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,null, script, args);
 }
 catch {
    MessageBox.Show("与JS交互出现问题");
 }
}

3.修改页面中的JavaScript代码,这里只Alert一下

<script type="text/javascript"> 
 function MyMethod(msg)
 {
    alert(msg);
 } 
</script>

以上,如有不足欢迎补充~

[转载请注明]

### 本地部署 QwQ-32B 的实现方案 为了成功在本地环境中部署 QwQ-32B 模型,需遵循以下技术细节和配置说明: #### 1. 环境准备 确保目标机器满足硬件需求并安装必要的软件依赖项。QwQ-32B 是一种大型语言模型,通常需要高性能 GPU 或 TPU 支持以加速计算过程[^1]。 - **操作系统**: 推荐使用 Linux 发行版(如 Ubuntu),因为其对深度学习框架的支持更为成熟。 - **CUDA 和 cuDNN**: 安装 NVIDIA 驱动程序兼容版本的 CUDA Toolkit 及 cuDNN 库,以便充分利用 GPU 加速功能。 ```bash sudo apt-get update && sudo apt-get install nvidia-cuda-toolkit ``` #### 2. 软件栈搭建 构建适合运行大模型的基础环境,主要涉及 Python 解释器及其扩展库的选择。 - **Python 版本**: 使用 Python 3.8 或更高版本作为开发平台的语言基础。 - **PyTorch/TensorFlow**: 这些主流深度学习框架提供了加载预训练权重文件的能力,并简化了推理流程的设计。 对于 PyTorch 用户而言,可以通过 pip 工具快速完成核心组件的获取工作: ```bash pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 ``` #### 3. 下载模型参数 访问官方资源站点下载经过优化处理后的 QwQ-32B 权重数据集。注意保护个人隐私信息不被泄露的同时也要遵守相关法律法规关于人工智能应用的规定。 假设已经获得合法授权,则可以按照如下方式保存至指定目录下: ```python import os from huggingface_hub import snapshot_download model_name = "AliCloud/QwQ-32B" save_path = "./models" if not os.path.exists(save_path): os.makedirs(save_path) snapshot_download(repo_id=model_name, local_dir=save_path) ``` #### 4. 编写服务接口代码 最后一步就是定义 RESTful API 或命令行工具来暴露预测能力给外部调用者。这里给出基于 FastAPI 构建简单 HTTP 服务器的例子: ```python from fastapi import FastAPI from transformers import AutoTokenizer, AutoModelForCausalLM import torch app = FastAPI() tokenizer = AutoTokenizer.from_pretrained("./models") model = AutoModelForCausalLM.from_pretrained("./models").to(&#39;cuda&#39;) @app.post("/predict/") async def predict(prompt: str): inputs = tokenizer.encode(prompt, return_tensors="pt").to(&#39;cuda&#39;) outputs = model.generate(inputs, max_length=50) result = tokenizer.decode(outputs[0], skip_special_tokens=True) return {"response": result} ``` 通过上述步骤即可实现本地计算机上启动支持 QwQ-32B 大规模自然语言理解的服务实例。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值