Fortran Coder

查看: 4704|回复: 11
打印 上一主题 下一主题

[讨论] 隐藏文件到exe中

[复制链接]

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
跳转到指定楼层
楼主
发表于 2023-2-1 15:23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有没有办法把一个文件(图片,office文档等),隐藏到Fortran的exe中,运行这个exe的时候自动释放出来,运行结束了再删掉?
分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2023-2-1 16:52:13 | 只看该作者
windows系统的话,可以包含在 Resource 资源里。
然后通过 FindResourceEx,LoadResource,SizeofResource 这几个函数,得到资源体。Open , Write 到文件里去。
[Fortran] 纯文本查看 复制代码
  Logical Function WriteResourceToFile( resType , resID , fileName ) result(ok)
    use , intrinsic :: ISO_C_Binding
    use kernel32 , only : SizeofResource , LockResource , LoadResource , FindResourceEx
    Character(Len=*) , intent(IN) :: resType , fileName
    Integer , intent(IN) :: resID
    character(len=len_trim(resType)+1) :: myType
    character , pointer :: pMem(:)
    integer :: hRes,hMem, j
    type(c_ptr) :: cp
    ok = .false.
    myType = trim(resType)//c_null_char
    hRes = FindResourceEx(0,transfer(c_loc(myType),j),resID,0_2)
    if( hRes == 0 ) return
    hMem = LoadResource(0,hRes)
    if( hMem == 0 ) return
    hMem = LockResource( hMem )
    if( hMem == 0 ) return
    j = SizeofResource(0,hRes)
    if( j == 0 ) return
    call c_f_pointer( transfer( hMem , cp ) , pMem , [j] )
    Open(NewUnit = j , File = fileName , access="stream")
    write(j) pMem
    Close(j)
    ok = .true.
  End Function WriteResourceToFile



131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
板凳
 楼主| 发表于 2023-2-1 17:51:52 | 只看该作者
fcode 发表于 2023-2-1 16:52
windows系统的话,可以包含在 Resource 资源里。
然后通过 FindResourceEx,LoadResource,SizeofResource  ...

多谢回复!
这些是Windows的API?大致理解原理了,但是在Fortran中怎么用这些函数?能否帮忙做个Demo?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2023-2-1 19:11:46 | 只看该作者
你用的什么编译器?

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
5#
 楼主| 发表于 2023-2-1 19:32:31 | 只看该作者
本帖最后由 andy8496 于 2023-2-1 19:34 编辑
fcode 发表于 2023-2-1 16:52
windows系统的话,可以包含在 Resource 资源里。
然后通过 FindResourceEx,LoadResource,SizeofResource  ...

非常感谢!
恕我愚钝, 没懂函数的参数什么意思
Function WriteResourceToFile( resType , resID , fileName )
resType : 如果是二进制文件,应该如何指定该类型?直接用资源文件后缀名可否?
resID : 如何得到这个ID?我查了函数原型:

HRSRC FindResourceEx(HXODULE hModule,LPCTSTR lpType,LPCTSTR lpName,WORD wLanguage);

参数:

lpName:指向说明资源文件名称并以NULL为结束符的字符串。若要了解更多的信息,请参见注意部分。
这是不是应该是资源文件的名称字符串?
如果确为整数ID,我调用此函数前应该如何得到该ID?
另外,0_2,是什么意思呢?

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
6#
 楼主| 发表于 2023-2-1 19:34:43 | 只看该作者
本帖最后由 andy8496 于 2023-2-1 19:40 编辑
fcode 发表于 2023-2-1 19:11
你用的什么编译器?

VS+IVF+Win7
奇怪,好像我在Resource Files里面加不加文件,编译出来的exe大小是一样的。

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

7#
发表于 2023-2-1 20:36:48 | 只看该作者
andy8496 发表于 2023-2-1 19:34
VS+IVF+Win7
奇怪,好像我在Resource Files里面加不加文件,编译出来的exe大小是一样的。
...

先添加资源文件 *.rc
然后在 rc文件里导入被包含文件

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

8#
发表于 2023-2-1 20:41:12 | 只看该作者
andy8496 发表于 2023-2-1 19:32
非常感谢!
恕我愚钝, 没懂函数的参数什么意思
Function WriteResourceToFile( resType , resID , fileNa ...

windows 的资源有不同的类型,例如字符串表,位图,菜单,对话框,图标,版权信息。
这些都是windows资源内置的类型。你也可以自定义类型,比如类型名为 ABC。
lpType 指向类型名。

每个类型可以有多个文件。例如可以有2个菜单,3个对话框等等。每一个有自己独有的名称。
lpName 指向名称。
名称也可以是整型(需要小于65535),就是一个编号。(我的例子中的 resID)

每个文件又可以有不同的语言版本,这样可以实现在英文系统就是英文的资源,中文系统就是中文的资源(例如菜单等)
0_2 表示 kind=2 的整数 0,在例子中充当 WORD wLanguage 语言。

131

帖子

34

主题

0

精华

宗师

F 币
1602 元
贡献
813 点
9#
 楼主| 发表于 2023-2-1 22:39:29 | 只看该作者
andy8496 发表于 2023-2-1 19:32
非常感谢!
恕我愚钝, 没懂函数的参数什么意思
Function WriteResourceToFile( resType , resID , fileNa ...

终于成功了!如果我想编译成64位的,
use kernel32 , only : SizeofResource , LockResource , LoadResource , FindResourceEx
需要改成什么名字?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

10#
发表于 2023-2-2 08:35:16 | 只看该作者
andy8496 发表于 2023-2-1 22:39
终于成功了!如果我想编译成64位的,
use kernel32 , only : SizeofResource , LockResource , LoadResou ...

好的,我改得严谨一点,可以兼容x86和x64。
另外,你可以尝试在 rc 文件里包含一个 ico 图标,和版权信息。不用写任何代码,就有效果。很有趣。

[Fortran] 纯文本查看 复制代码
Logical Function WriteResourceToFile( resType , resID , fileName ) result(ok)
  use , intrinsic :: ISO_C_Binding
  use kernel32 , only : WORD,LPVOID,HANDLE, &
    SizeofResource , LockResource , LoadResource , FindResourceEx
  Character(Len=*) , intent(IN) :: resType , fileName
  Integer(LPVOID) , intent(IN) :: resID
  integer(HANDLE) :: hRes,hMem
  integer :: j
  character(len=len_trim(resType)+1) :: myType
  character , pointer :: pMem(:)
  type(c_ptr) :: cp
  ok = .false.
  myType = trim(resType)//c_null_char
  hRes = FindResourceEx(0_HANDLE,transfer(c_loc(myType),hRes),resID,0_WORD)
  if( hRes == 0_HANDLE ) return
  hMem = LoadResource(0_HANDLE,hRes)
  if( hMem == 0_HANDLE ) return
  hMem = LockResource( hMem )
  if( hMem == 0_HANDLE ) return
  j = SizeofResource(0_HANDLE,hRes)
  if( j == 0 ) return
  call c_f_pointer( transfer( hMem , cp ) , pMem , [j] )
  Open(NewUnit = j , File = fileName , access="stream")
  write(j) pMem
  Close(j)
  ok = .true.
End Function WriteResourceToFile

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 18:47

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表