Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Mingw中将C程序编译为dll,以便与Inno Setup&;一起使用;回拨_C_Callback_Mingw_Inno Setup_Dllexport - Fatal编程技术网

如何在Mingw中将C程序编译为dll,以便与Inno Setup&;一起使用;回拨

如何在Mingw中将C程序编译为dll,以便与Inno Setup&;一起使用;回拨,c,callback,mingw,inno-setup,dllexport,C,Callback,Mingw,Inno Setup,Dllexport,我有下面的程序,它是在很多帮助下编写的。它将分解PKWare DCL compressed.vol归档文件(文件id RESLIST),并将文件提取到指定的输出文件夹,为提取的文件提供原始.vol文件的修改日期。它将用于Inno安装程序,我想看看是否可以将其编译为.dll库,然后导入.iss脚本ie: function VolEx( filename, outputpath: String ): Integer; external 'VolExA@volex.dll stdcall'; 我通读

我有下面的程序,它是在很多帮助下编写的。它将分解PKWare DCL compressed.vol归档文件(文件id RESLIST),并将文件提取到指定的输出文件夹,为提取的文件提供原始.vol文件的修改日期。它将用于Inno安装程序,我想看看是否可以将其编译为.dll库,然后导入.iss脚本ie:

function VolEx( filename, outputpath: String ): Integer; external 'VolExA@volex.dll stdcall';
我通读了一遍,但很难理解ifdef和extern“C”的所有内容

此外,我希望它能够更改我的安装程序中的WizardForm.FilenameLabel.Caption以匹配当前提取的文件(我知道这需要InnoTools InnoCallback;FreeArc也做了类似的事情)

Volex.c(包括blast.c和blast.h,从这里开始:)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“blast.h”
#定义局部静态
#定义卷ID“RESLIST”
结构inbuf{
无符号长左;
无符号字符*buf;
无符号大小;
文件*in;
};
结构stat statbuf;
时间;
时间与电压;
新时代的组织结构;
本地未签名inf(无效*方式,未签名字符**buf)
{
无符号len;
结构inbuf*inb=如何;
len=inb->size>inb->left?inb->left:inb->size;
len=fread(进料->进料,1,进料,进料->进料);
inb->左-=透镜;
*buf=inb->buf;
回程透镜;
}
本地整数输出(void*how,unsigned char*buf,unsigned len)
{
返回fwrite(buf,1,len,(FILE*)how)!=len;
}
#定义BUFSIZE 16384/*必须适合未签名*/
本地整数提取(字符*名称、无符号长长度、文件*输入、字符*路径、时间\u t前置时间)
{
INTERR;
归档;
结构inbuf-inb;
无符号字符buf[BUFSIZE];
inb.left=len;
inb.buf=buf;
inb.size=BUFSIZE;
inb.in=in;
mkdir(路径);
字符输出路径[strlen(path)+20];
strcpy(输出路径、路径);
strcat(输出路径“\\”;
strcat(输出路径、名称);
out=fopen(输出路径,“wb”);
if(out==NULL)
返回2;
err=blast(inf、inb、out、out);
fclose(out);
if(stat(输出路径和statbuf)<0){
佩罗尔(门诊);
返回1;
}
mtime=statbuf.st_mtime;/*自纪元起的秒数*/
new_times.actime=statbuf.st_atime;/*保持atime不变*/
new_times.modtime=prevtime;/*将mtime设置为当前时间*/
if(utime(输出路径和新时间)<0){
佩罗尔(门诊);
返回1;
}
返回错误;
}
int main(int argc,char*argv[])
{
如果(argc!=3)
{
printf(“用法:%s”,argv[0]);
返回1;
}
其他的
{
文件*in=fopen(argv[1],“rb”);
未签名的long off,next;
INTERR;
无符号字符头[24];
if(stat(argv[1],&statbuf)<0){
perror(argv[1]);
返回1;
}
voltime=statbuf.st_mtime;/*自纪元起的秒数*/
if(fread(head,1,8,in)!=8 | | memcmp(head,VOLID,8)){
fprintf(stderr,“不是预期的.vol格式\n”);
返回1;
}
关=8;
while((next=fread(head,1,24,in))==24){
关+=24;

next=head[20]+(head[21]假设您使用的是ANSI Inno设置,以下Inno签名:

function VolEx( filename, outputpath: String ): Integer; external 'VolExA@volex.dll stdcall';
在DLL代码中需要以下C签名:

int __stdcall __declspec(dllexport) VolExA(const char *filename, const char *outputpath);

(如果你将DLL编译为C++而不是C,那么你也将需要一个<代码>外部的“C”<代码>。 您需要在DLL中声明此函数,并将适当的代码从上面的“main”移到其中,然后删除主函数并编译为DLL而不是控制台应用程序


在担心通过回调的反馈之前,先让这部分工作起来——如果您有问题,请提交一个单独的问题。

为什么不在您的开发人员计算机上提取文件,并使用普通的Inno[files]条目重新打包?Inno的压缩通常比大多数替代方法都好(特别是如果您增加了设置),那么一切都会为您处理,您不需要做任何花哨的事情。安装程序意味着作为更新/补丁,要提取的文件位于CD-ROM上。这意味着您有两个选择:将文件分开并解压缩,然后使用外部标志(从而允许用户独立访问文件,或启用“无需安装光盘即可运行”选项),或以某种方式压缩。在这两种情况下,都没有任何理由查看外部压缩工具。这是一个32位游戏的替代安装程序,它使用了16位安装程序,该安装程序还安装了最新的补丁。文件需要解压缩才能运行游戏,因此,如果我想运行,则需要外部解压缩工具o能够将其分发给其他人使用。不要还原该编辑。删除的文本不是必需的。
int __stdcall __declspec(dllexport) VolExA(const char *filename, const char *outputpath);