一个程序生成另一个程序
来源:互联网 发布:淘宝店怎么起名字 编辑:程序博客网 时间:2024/05/16 15:30
以前看过authorware,authorware 生成的东西只有在authorware 里才能运行。 恰巧网上有人讨论怎么从一个程序生成另一个程序。 网上是有一些软件要怎么做。 比如电子教室, 录制生成的东西本身是exe。如游戏制作工具, 制作完就是一个exe(这里的exe不外带数据文件, 和库
文件文件)
我想软件就是数据+执行代码。 执行代码是很诡异的事情, 从母程序编译执行代码是不可思议的事情吧。 那么做法应该是很确定了, 先准
备一个子程序模板, 这个模板子程序放个数据占位, 只做数据解析工作,以先前的authorware为例, 子程序拥有解析母程序生成数据的模块
。
然后母程序加个功能, 先拷贝一份模板子程序, 然后在其插入数据 。
windows 的可执行程序是PE格式。 资源数据放在.rsrc节里, 但是PE的解析, 是十分繁琐的事情. 而API也是有相关的函数的。
下面是我写的一个模块做个演示,没写完, 有时间补上。
//头文件
//////////////////////////////////////////////////////////////////////////////////////
//可执行文件产生器
class Generator
{
public:
Generator(){}
virtual ~Generator(){}
public:
virtual bool IsBinary() const = 0; //检查完整性
//替换资源
virtual bool ReplaceResource(const char* name, const char* type, const void* dat a, unsigned long len) = 0;
virtual bool GeneratorBin() = 0; //拷贝文件
};
//////////////////////////////////////////////////////////////////////////////////////
//可执行文件产生器--API实现
class MSApiGenerator : public Generator
{
public:
MSApiGenerator(const char* binaryDest, const char* binarySource);
virtual ~MSApiGenerator();
protected:
MSApiGenerator(const MSApiGenerator& ){}
MSApiGenerator& operator= (const MSApiGenerator&){}
public:
virtual bool IsBinary() const;
virtual bool ReplaceResource(const char* name, const char* type, const void* data, unsigned long len) ;
virtual bool GeneratorBin() ;
private:
std::string mBinaryDest;
std::string mBinarySource;
};
//////////////////////////////////////////////////////////////////////////////////////
//可执行文件产生器--PE实现
class PEGenerator : public Generator
{
public:
virtual bool IsBinary() const {}
virtual bool ReplaceResource(const char* name, const char* type, const void* da ta, unsigned long len) {}
virtual bool GeneratorBin() {}
};
//////////////////////////////////////////////////////////////////////////////////////
//类构造器
class GeneratorCreator
{
public:
GeneratorCreator(void){}
~GeneratorCreator(void){ mInstance = 0;}
protected:
GeneratorCreator(const GeneratorCreator& ){}
GeneratorCreator& operator= (const GeneratorCreator&){}
public:
static GeneratorCreator* GetInstance();
public:
//API 子类产生函数
Generator* MSApiProduct(const char* binaryDest, const char* binarySource) const;
//PE 子类产生函数
Generator* PEProduct(const char* binaryDest, const char* binarySource) const;
private:
static GeneratorCreator *mInstance;
};
//实现文件
//////////////////////////////////////////////////////////////////////////////////////
MSApiGenerator::MSApiGenerator(const char* binaryDest, const char* binarySource)
:mBinaryDest(binaryDest), mBinarySource(binarySource)
{
}
MSApiGenerator::~MSApiGenerator()
{
}
bool MSApiGenerator::IsBinary() const
{
if (mBinaryDest.empty() || mBinarySource.empty())
{
return false;
}
if (!GetBinaryType(mBinarySource.c_str(),SCS_32BIT_BINARY))
{
return false;
}
return true;
}
bool MSApiGenerator::ReplaceResource(const char* name, const char* type, const void* data, unsigned long len)
{
if (!IsBinary())
{
return false;
}
HANDLE hUpdate = BeginUpdateResource(mBinarySource.c_str(), FALSE);
if (hUpdate==NULL)
{
return false;
}
if (!UpdateResource(hUpdate, type, name, -1/*乱写的*/, (LPVOID)data, len))
{
return false;
}
EndUpdateResource(hUpdate, FALSE);
return true;
}
bool MSApiGenerator::GeneratorBin()
{
return true;
}
//////////////////////////////////////////////////////////////////////////////////////
GeneratorCreator* GeneratorCreator::mInstance=0;
GeneratorCreator* GeneratorCreator::GetInstance()
{
if (mInstance)
{
return mInstance;
}
mInstance = new GeneratorCreator;
return mInstance;
}
Generator* GeneratorCreator::MSApiProduct(const char* binaryDest, const char* binarySource) const
{
return new MSApiGenerator(binaryDest, binarySource);
}
Generator* GeneratorCreator::PEProduct(const char* binaryDest, const char* binarySource) const
{
return 0;
}
//demo
///////////////////////////////////////////////////////////////
//修改程序
int main(int argc, char *argv[])
{
Generator *generator = GeneratorCreator::GetInstance()->MSApiProduct("...", "....");
if (generator->IsBinary())
{
generator->ReplaceResource(....);
generator->ReplaceResource(....);
generator->GeneratorBin();
}
delete generator;
delete GeneratorCreator::GetInstance();
return 0;
}
- 一个程序生成另一个程序
- 用程序生成另一个程序
- 一个Agent如何以程序的方式生成另一个Agent
- 在程序在生成另一个程序
- 一个程序调用另一个程序 linux平台
- 在一个程序打开另一个程序
- 生成一个系统托盘程序
- 在一个程序中打开另一个应用程序
- 在一个程序中打开另一个应用程序
- 创建一个进程来执行另一个程序
- Android 在一个程序中启动另一个程序和启动另一个程序的服务
- 从一个程序中启动和关闭另一个程序
- net Compact Framework中用一个程序调用另一个程序
- 从一个程序中启动和关闭另一个程序
- 从一个程序中启动和关闭另一个程序
- 实现一个程序在另一个程序内运行
- 如何在一个程序里面呼叫另一个程序
- 在一个程序中控制另一个程序的函数调用
- BASE64与Quoted-Printable
- QT 自带例程编译不成功解决办法
- 多继承一题
- 三维形体的构造及表达
- 真高兴
- 一个程序生成另一个程序
- 接口和bug问题示例
- 窗口菜单栏工具栏
- Java 清屏 DOS界面
- 在解决哈希碰撞中二次探查法模数必须是4k+3的质数的原因
- Session.Abandon (当前页面结束之后删除Session对象) Session.Clear(清理Session对象中的内容)
- 要坚持自己的选择,不要随便听信别人
- 实体建模 CSG Vs. BRep
- [每天读一点英文]Obama Radio Address on Inauguration Week January 17, 2009 gnuhpc标注版