c++内存执行脚本语言

C++高级编程(94)构建自己的脚本语言 通过本篇博客的学习,我们应该能够理解构建自己脚本语言的基本步骤和所涉及的技术。这是一个复杂但非常有益的项目,它不仅可以帮助解决特定的问题,还可以作为深入学习计算机科学的一个项目。在实践中,我们需要根据具体的需求和场景来选择合适的工具和技术。随着技术的发展,我们期待有更多先进的工具和方法论来帮助我们更好地构建脚本语言。如果您有任何疑问或想要进一步讨论,请随时在评论区留言。让我们继续探索编程的奥秘,共同提高我们的编程技能! 阅读详情

好久没写博客了,抓住四月的小尾巴,分享一篇利用c++提供的com接口,来执行各种脚本语言

直接上代码,下面demo使用vs2019编译,功能是通过c++执行vbscript脚本,创建进程:

#include <iostream>
#include <windows.h>
#include <objbase.h>
#include <activscp.h>


using namespace std;

HRESULT getEngineGuid(LPCTSTR extension, GUID* guidBuffer)
{
    wchar_t   buffer[100];
    HKEY      hk;
    DWORD     size;
    HKEY      subKey;
    DWORD     type;

    // See if this file extension is associated
    // with an ActiveX script engine
    if (!RegOpenKeyEx(HKEY_CLASSES_ROOT, extension, 0,
        KEY_QUERY_VALUE | KEY_READ, &hk))
    {
        type = REG_SZ;
        size = sizeof(buffer);
        size = RegQueryValueEx(hk, 0, 0, &type,
            (LPBYTE)&buffer[0], &size);
        RegCloseKey(hk);
        if (!size)
        {
            // The engine set an association.
            // We got the Language string in buffer[]. Now
            // we can use it to look up the engine's GUID

            // Open HKEY_CLASSES_ROOT\{LanguageName}
        again:   size = sizeof(buffer);
            if (!RegOpenKeyEx(HKEY_CLASSES_ROOT, (LPCTSTR)&buffer[0], 0,
                KEY_QUERY_VALUE | KEY_READ, &hk))
            {
                // Read the GUID (in string format)
                // into buffer[] by querying the value of CLSID
                if (!RegOpenKeyExA(hk, "CLSID", 0,
                    KEY_QUERY_VALUE | KEY_READ, &subKey))
                {
                    size = RegQueryValueExW(subKey, 0, 0, &type,
                        (LPBYTE)&buffer[0], &size);
                    RegCloseKey(subKey);
                }
                else if (extension)
                {
                    // If an error, see if we have a "ScriptEngine"
                    // key under here that contains
                    // the real language name
                    if (!RegOpenKeyExA(hk, "ScriptEngine", 0,
                        KEY_QUERY_VALUE | KEY_READ, &subKey))
                    {
                        size = RegQueryValueEx(subKey, 0, 0, &type,
                            (LPBYTE)&buffer[0], &size);
                        RegCloseKey(subKey);
                        if (!size)
                        {
                            RegCloseKey(hk);
                            extension = 0;
                            goto again;
                        }
                    }
                }
            }

            RegCloseKey(hk);

            if (!size)
            {
                // Convert the GUID string to a GUID
                // and put it in caller's guidBuffer
                if ((size = CLSIDFromString(&buffer[0], guidBuffer)))
                    MessageBoxA(0, "Can't convert engine GUID",
                        "Error", MB_OK | MB_ICONEXCLAMATION);
                return(size);
            }
        }
    }

    MessageBoxA(0, "Can't get engine GUID from registry",
        "Error", MB_OK | MB_ICONEXCLAMATION);
    return(E_FAIL);
}

class CMyActiveScriptSite : public IActiveScriptSite
{
public:
    HRESULT STDMETHODCALLTYPE GetLCID(__RPC__out LCID* plcid) 
    {
        return S_OK;
    }


    HRESULT STDMETHODCALLTYPE GetItemInfo(
        /* [in] */ __RPC__in LPCOLESTR pstrName,
        /* [in] */ DWORD dwReturnMask,
        /* [out] */ __RPC__deref_out_opt IUnknown** ppiunkItem,
        /* [out] */ __RPC__deref_out_opt ITypeInfo** ppti)
    {
        return S_OK;
    }

     HRESULT STDMETHODCALLTYPE GetDocVersionString(
        /* [out] */ __RPC__deref_out_opt BSTR* pbstrVersion)
     {
         return S_OK;
     }

     HRESULT STDMETHODCALLTYPE OnScriptTerminate(
        /* [in] */ __RPC__in const VARIANT* pvarResult,
        /* [in] */ __RPC__in const EXCEPINFO* pexcepinfo)
     {
         return S_OK;
     }

     HRESULT STDMETHODCALLTYPE OnStateChange(
        /* [in] */ SCRIPTSTATE ssScriptState)
     {
         return S_OK;
     }

     HRESULT STDMETHODCALLTYPE OnScriptError(
        /* [in] */ __RPC__in_opt IActiveScriptError* pscripterror)
     {
         return S_OK;
     }

     HRESULT STDMETHODCALLTYPE OnEnterScript(void)
     {
         return S_OK;
     }

     HRESULT STDMETHODCALLTYPE OnLeaveScript(void)
     {
         return S_OK;
     }
     
      HRESULT STDMETHODCALLTYPE QueryInterface(
         /* [in] */ REFIID riid,
         /* [iid_is][out] */ _COM_Outptr_ void __RPC_FAR* __RPC_FAR* ppvObject)
     {
          if (riid == IID_IActiveScriptSite || (riid == IID_IUnknown))
          {
              *ppvObject = this;
              AddRef();
              return S_OK;
          }

          *ppvObject = NULL;
          return E_NOINTERFACE;
     }

      ULONG STDMETHODCALLTYPE AddRef(void)
     {
         return S_OK;
     }

      ULONG STDMETHODCALLTYPE Release(void)
     {
         return S_OK;
     }

};
int main()
{
    GUID guidBuffer = { 0 };
    IActiveScript* activeScript = NULL;
    IActiveScriptParse* activeScriptParse = NULL;
    CMyActiveScriptSite MyActiveScriptSite;
    wchar_t VBscript[] = L"Set Sh = CreateObject(\"WScript.Shell\")\r\n\
        Sh.Run \"calc.exe\", 0";

    do
    {
        HRESULT res = getEngineGuid(L".vbs", &guidBuffer);
        if (res != ERROR_SUCCESS)
        {
            break;
        }
        res = CoInitialize(0);
        res = CoCreateInstance(guidBuffer, 0, CLSCTX_ALL, (const IID)IID_IActiveScript, (void**)&activeScript);
        if (res != ERROR_SUCCESS)
        {
            break;
        }

        res = activeScript->QueryInterface(IID_IActiveScriptParse,(void**)&activeScriptParse);
        if (res != ERROR_SUCCESS)
        {
            break;
        }

        res = activeScriptParse->InitNew();
        if (res != ERROR_SUCCESS)
        {
            break;
        }

        res = activeScript->SetScriptSite((IActiveScriptSite*)&MyActiveScriptSite);
        if (res != ERROR_SUCCESS)
        {
            break;
        }

        res = activeScriptParse->ParseScriptText(&VBscript[0],0,0,0,0,0,0,0,0);
        if (res != ERROR_SUCCESS)
        {
            break;
        }

        res = activeScript->SetScriptState(SCRIPTSTATE_CONNECTED);
        if (res != ERROR_SUCCESS)
        {
            break;
        }

        res = activeScript->Close();
        if (res != ERROR_SUCCESS)
        {
            break;
        }
        activeScript->Release();
        activeScriptParse->Release();



        CoUninitialize();
    } while (0);


    std::cout << "Hello World!\n";
}


参考资料:
https://www.codeproject.com/Articles/14905/COM-in-plain-C-Part-6
https://modexp.wordpress.com/2019/07/21/inmem-exec-script/

C++高级编程(84)脚本语言集成(如Python/Lua) 通过本篇博客的学习,我们应该能够理解在C++中集成脚本语言的好处以及如何实现它。无论是选择Python还是Lua,集成脚本语言都可以为C++应用带来更高的灵活性和开发效率。在实践中,我们需要根据具体的需求和场景来选择合适的脚本语言和集成方式。随着技术的发展,我们期待有更多先进的工具和方法论来帮助我们更好地集成脚本语言。如果您有任何疑问或想要进一步讨论,请随时在评论区留言。让我们继续探索C++的奥秘,共同提高我们的编程技能! 阅读详情

相关推荐

C/C++教程 第二十七章 —— 脚本开发

本章主要介绍windows与Linux平台下的脚本开发

余识- 5414

在Windows命令行中编译运行C/C++程序

此处运行环境是在Windos下,运行cmd命令进入DOS界面 首先,如果想在DOS窗口中进行C/C++代码的编译,则需要先配置gcc的环境变量。 1、使用g++进行编译链接 为了可以方便观察,这里我使用一份Helloworld代码(HelloWorld.cpp) #include <iostream> using namespace std; int main(){ cout << "HelloWorld!" << endl; syste..

平凡小智 5万+

c++调用vbs脚本函数(Qt)

Qt工程,c++代码调用vbs脚本函数,一个很简单的demo,参考学习

C/C++脚本化: 探索篇

使用C/C++等系统级语言开发业务逻辑效率太低? 这个功能用脚本写最多只要三天?我们对执行速度和资源又没啥要求…… 不知道过去你是否也有过这样的想法? 随着软件工程与计算机硬件的飞速发展,对于一些开发场景来说,系统级语言多少显得有点“大材小用”了,这迫使我们需要结合一门脚本语言相互配合,快速迭代产品。 本文主要描述通过脚本语言来扩展C/C++,而非以脚本语言为主的应用场景。

如人饮水冷暖自知 1539

通过arcmap制作的第一张流域图

需要知道,识别河流依次需要填洼,流向,流量,栅格计算器,河流链接,河网分级.通过卫星图确定河流入口,在入口处画一个点,注意不要与其他河流相交。随后是进行对河流的筛选使用con函数,筛选流量大于100的河流。我们使用镶嵌工具-->镶嵌至新栅格 将两个数据合并。填洼后如图,随后进行流向的获得.使用流向工具。首先导入准备好的数据,可见两张图片并非一体。教程参考b站up:爱画地图的boney。惊醒栅格河网矢量化,进行河流分级。输入表面栅格数据,等待后如图。本次制作的是双峰县的流域图。输入流向数据,输出后如图。

pianmian1的博客 2229

【鸿蒙南向开发】OpenHarmony音频驱动audio适配方案

这份鸿蒙(HarmonyOS NEXT)文档包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_666的博客 4513

C++和C的区别

问:能说一下C++和C的区别吗? 扩展: 问:请简要说明一下C++和Java的区别。 问:请简要说明一下C++和python的区别。

qq_46111138的博客 4220

深入解析Carry4的内部结构与工作原理

本文深入解析了Xilinx/AMD FPGA中的核心硬件资源Carry4的内部结构和工作原理。作为实现超前进位的关键物理电路,Carry4通过其CI、DI、S、O、CO等端口,高效处理4位算术运算的进位逻辑。文章通过端口详解、结构分析和实战计算示例,揭示了其如何加速加法、减法等运算,并探讨了其在优化FPGA设计时序与资源利用中的关键作用。

n4o5p6q7r的博客 501

Canopy C 插件开发指南:构建、测试、代码规范与工程结构全解析

Canopy 是采用 Go 语言实现的区块链网络协议,其核心机制之一是通过"无 VM"(VM-less)的插件体系扩展状态机(FSM)能力——插件以独立进程运行,通过 Unix Socket 与 Canopy 节点通信,以 Protocol Buffers 完成消息序列化。本指南围绕 [plugin/csharp/CRUSH.md](https://link.gitcode.com/i/2b71c

gitblog_01098的博客 599

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3191

Qt C++ 实现一个完整的扫雷

mineCountLabel = new QLabel(QString("地雷: %1").arg(remainingMines, 3, 10, QChar('0')), this);mineCountLabel->setText(QString("地雷: %1").arg(remainingMines, 3, 10, QChar('0')));timeLabel->setText(QString("时间: %1").arg(gameTime, 3, 10, QChar('0')));" : "游戏失败!

寒寒豆豆软件公司的博客 107

lua脚本语言认识

LUA语言入门

z1236464的博客 565

ERROR conda.core.link:_execute(502): error occurred while installing conda-forge::setuptools 解决方案

本文主要介绍了ERROR conda.core.link:_execute(502): An error occurred while installing package mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge::setuptools-65.5.1-pyhd8ed1ab_0.FileNotFoundError(2, 系统找不到指定的文件。, None, 2) 解决方案,希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

PHP vs C++:30秒看懂核心区别

PHP与C++是两种差异显著的编程语言。PHP是解释型脚本语言,主要用于Web开发,具有弱类型和自动内存管理特性,适合快速开发。C++是编译型语言,强调高性能和系统编程,采用强类型和手动内存管理,适用于底层开发。PHP在Web场景中通过优化可提升性能,而C++在计算密集型任务中具有明显优势。选择依据:Web应用选PHP,系统/高性能开发选C++。

liangkang的博客 415

EMI辐射发射超标案例

EMI辐射发射超标案例

让你爱上电路设计 8503

Oracle EBS AP发票被预付款核算创建会计科目时间超长

在客户职能部门的水电、通信和物业等费用统一管理或对接部门报销时,用户将所有费用分摊到各个末级部门,导致AP发票行数高达上千行。这引发了以下问题:1)用户过账时,创建会计科目的请求执行超过20小时未完成,只能手动取消;2)取消请求后,系统一直处于回滚状态;3)通过SQL脚本分析,发现预付发票核销分配行表记录数量庞大,单笔AP发票记录高达90多万条,类似发票共有5笔。

陈显平的专栏-Oracle EBS 352

PHP与C++:Web脚本与系统编程的终极对决

PHP和C++是两种用途不同的编程语言。PHP主要用于Web开发,作为服务器端脚本语言动态生成HTML内容,具有弱类型、解释执行和自动内存管理等特点,适合快速开发网站后端。C++则是通用编译型语言,强调高性能和底层控制,适用于系统编程、游戏开发等领域,需要手动管理内存和显式类型声明。PHP开发效率高但性能较低,C++性能优越但学习难度大。选择时应根据项目需求:Web服务优先考虑PHP,高性能应用则选用C++,二者也可结合使用优势互补。

jwn999的博客 386

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

PHP vs C++:编程语言终极对决

PHP和C++是两种差异显著的编程语言。PHP是解释型脚本语言,专为Web开发设计,具有自动内存管理和快速开发特性,适合构建动态网站;C++是编译型系统语言,强调高性能和底层控制,需要手动内存管理,适用于操作系统、游戏引擎等高性能场景。PHP语法简单适合快速开发,C++语法复杂但执行效率高。选择取决于项目需求:Web开发选PHP,系统级开发选C++,两者也可协同使用。

luanma150980的博客 299

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

C++与脚本语言混合系统架构:高性能与灵活性的工程实践

在软件架构设计中,混合编程模型通过结合编译型语言与解释型语言的优势,实现了性能与开发效率的平衡。其核心原理在于将系统划分为性能层与逻辑层:性能层由C++等编译语言处理计算密集型任务,逻辑层则由Lua、Python等脚本语言负责快速迭代的业务逻辑。这种架构的技术价值在于,既能发挥C++的硬件级性能优势,又能利用脚本语言的热更新特性,大幅提升开发调试效率。在应用场景上,它广泛应用于游戏引擎、高频交易系统、嵌入式开发及大型基础设施中,用于处理游戏AI、业务规则、UI交互等频繁变动的部分。本文以C++与Lua的集成

weixin_31960565的博客 317

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

从零构建自定义脚本语言编译器:C++实现无SDK编译全流程

编译原理是计算机科学的核心基础,它定义了高级语言如何转化为机器可执行的指令。其核心流程包括词法分析、语法解析、语义分析和代码生成,这些技术构成了现代编程语言和解释器的基石。理解编译原理不仅能深化对语言运行机制的认识,更能为构建高性能、定制化的软件系统提供底层支持。在游戏开发、嵌入式系统和领域特定语言等场景中,拥有完全自主的编译流程意味着可以针对特定硬件架构进行极致优化,实现高度定制化的语法特性,并构建安全可控的运行时环境。本文聚焦于如何不依赖任何现成SDK,使用C++从零实现一个完整的脚本语言编译流水线,涵

weixin_34101784的博客 482

PHP vs C++:谁才是编程王者?

PHP与C++的主要区别:PHP是解释型脚本语言,用于Web开发,具有弱类型和自动内存管理;C++是编译型语言,用于系统开发,采用强类型和手动内存管理。PHP依赖服务器环境执行,性能中等但开发效率高;C++编译为独立可执行文件,性能卓越但学习门槛较高。PHP适合快速构建Web应用,C++适用于高性能系统开发。

chiandy123的博客 343

PHP vs C++:10倍性能差距的编程语言对决

PHP与C++是两种差异显著的编程语言:PHP是解释执行的服务器端脚本语言,采用动态弱类型和自动内存管理,适合快速开发Web应用;C++是编译型系统语言,具有静态强类型和手动内存管理,适用于开发高性能系统。主要区别体现在执行方式(解释vs编译)、类型系统(动态vs静态)、内存管理(自动vs手动)以及性能(C++比PHP快10-100倍)等方面。选择依据取决于项目需求:Web开发首选PHP,系统/游戏开发则需C++。

cch8918的博客 396

PHP vs C++:Web开发与系统编程的终极对决

PHP和C++是两类差异显著的编程语言:PHP是弱类型的Web脚本语言,内置HTTP处理功能,适合快速开发网站后端;C++是强类型的编译语言,需要手动管理内存,擅长系统编程和高性能应用。PHP通过解释器运行,开发效率高但性能中等;C++直接编译为机器码,执行效率优异但学习成本较高。选择取决于项目需求——Web开发选PHP,系统级/性能敏感型开发选C++。

love245565986的专栏 993

交易信号低延时计算实测:百因子整体时延 40 微秒,用脚本写出媲美 C++的性能

用户只需用 DolphinDB 脚本编写因子与策略,就可以完成一个开发效率超越 Python,执行效率媲美优秀 C++ 程序的投研交易框架——这样的工程飞跃与效率提升是否会成为量化行业的下一个现实?

DolphinDB智臾科技 772

一个环境变成一千种条件:Isaac Lab-Arena Variation系统实战(光照/HDR/相机/物体质量)

Isaac Lab-Arena 的 Variation(随机化)系统,让你用一个环境配置自动派生出成千上万种"条件变体"——不同背景 HDR、不同光照强度、不同相机位姿、不同物体质量,无需手写任何随机化脚本。本文带你从零认识 Variation:它分 build-time 与 run-time 两类,如何一键列出、一键开启,如何用官方示例实验跑通"5 次重建 5 种条件",以及如何在大规模评估中精

gitblog_00177的博客 436

C++使用Google V8 引擎集成JS脚本能力

V8 引擎简介 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版 ,可以运行在所有的主流操作系统中,甚至可以运行在移动终端 ( 基于 ARM 的处理器,如 HTC G7 等 )。V8 最早被开发用以嵌入到 Google 的开源浏览器 Chrome 中,但是 V8 是一个可以独立的模块,完全可以嵌入您自己的应用,著名的 Node.js( 一个异步的服务器框架,可以在服务端使用 JavaScript 写出高效的网络服务器 ) 就是基于 V8 引擎的。 和其他 JavaS

weixin_42684313的博客 3511
上一篇: javascript shellcode to c shellcode
下一篇: host key for (ip地址) has changed and you have requested strict checking
FFE4
博客等级 码龄9年 234粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值