现在有个文件,文件比较大,需要直接嵌入到exe中,在程序中使用(非资源文件形式的嵌入)最后实现的效果类似于这样。其中文件的内容直接嵌入到了代码段1之后,假设文件内容的首地址是addr,那么在代码段1里面就可以用这个地址就行操作了这和直接在程序中定义数组很像,但是有两点
1、文件比较大,定义数据容易出问题
2、数组存在exe的单独节里面,而非可以嵌入到代码段中不知delphi/bcb有没有这种指令A
直接写在代码里面
例如
函数1
$A"文件路径"
函数2之后编译出来的就是这种结果

解决方案 »

  1.   

    楼上说的有道理
    可以参考一下Picture.Data的实现
    在窗口上放个picture设置上图片
    用记事本打开.dfm文件就能看到picture.data的二进制文件了
      

  2.   

    不是,和dfm不一样,dfm最后都是放到资源节里面了,我这个就是类似于源程序中写了一个标记,然后编译时直接用文件的二进制内容替代这个标记
      

  3.   

    不知通过
    asm
    end;
    方法能否实现这样的,知道的说下撒
      

  4.   

    如果你非要这样做(其实个人感觉还是用resource好),你可以这样:
    以下用bcb2010测试通过
    ...
    char * data()
     {
      char *p;
     __asm {
       far jmp  @dataend
       db 1,2,3,4,5,6,7,8 //将你的文件生成一组数据,这个应该简单吧
       @dataend:
       mov p,offset data
     }
    return p+6; //注意,由于优化及我数据量少的原因,这里是6,jmp far 只生成2byte机器码,如果你数据量大,可能+10
      }
    ...
    这个代码中间含了你的数据,像你要求的一样,在代码段,这个函数返回了数据的地址,你可以
    要求再高些:
    如果你不想用函数返回数据的地址,而要直接使用数据地址,就用#pragma inline ,这样你的嵌入汇编就更强,但编译速度要慢很多,另一方法就是数据部分直接用一个汇编文件,并加入你的工程.
      

  5.   

    个人建议还是用DLL调用函数,你这么做也可行,参考文件感染的技术,不过堆栈平衡会是一个处理起来很麻烦的事情
      

  6.   

    我做过, 很简单, 是通过内嵌汇编实现的, 比如:
    procedure data;
    asm
      db 1024 dup (0)
    end;就是在代码中留了1024字节空位. 其它过程/函数可以通过@data读写(当然写前先用VirtualProtect()把data所在页设成可写)。
    我当初使用时实际上是通过另一个工具程序将数据写入这个exe中的。保存了一段加解密用的密钥和代码。当然实际程序没这么简单,这个data是段真正的内嵌汇编, 不过当中有部分汇编指令和内嵌数据是运行时通过外部程序动态写入的
      

  7.   

    如果是 
    procedure fun1
    begin
    fun1内容
    end
    procedure data
    _asm
    嵌入文件内容
    endprocedure fun2
    fun2内容
    end那么这样直接编译的话,是依次fun1,data,fun2么??
    PS:大文件直接嵌入汇编,没有一种直接写文件路径,然后文件被当成二进制载入的方案么?难道只能将文件转成字符,然后在copy进去??
    直接include文件的话,文件会被当成txt处理,二进制文件处理不了,应该会直接报错的
      

  8.   

    1.顺序没问题
    2.没有一种直接写文件路径的方法,一般的编译器不支持.自己将文件转一下很简单的
    3.肯定不能直接include,因为你是二进制文件(如果转成文本是可以的)