恳请援助有关ISAPI(200分)

  • 主题发起人 主题发起人 amo
  • 开始时间 开始时间
A

amo

Unregistered / Unconfirmed
GUEST, unregistred user!
我用DELPHI做了一个ISAPI 动态连接库功能是传送一幅BMP图第一次调用成功但第二次就失败,提示内部错误使,我措手无策。请个位帮帮忙!
还有在DELPHI4中怎样调试ISAPI动态连接库(怎样进入动态连接库?)
 
在delphi的help里搜索isapi,里面讲了如何debug(在不同的操作系统,webserver
下)
 
用CGI Expert可以象普通程序一样调试CGI/ISAPI程序. :-)
 
贴原码上来.
 
源码:
var
WebModule1: TWebModule1;
S: TMemoryStream;

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest
Response: TWebResponse
var Handled: Boolean);
var
sCode, sKind, sSize: string;
Kind, Size: integer;
Gif: TGifImage;
bmp :TBitmap;
Picture: TJPEGImage;
begin
Picture := TJPEGImage.create;
try
bmp := TBitmap.Create;
bmp.LoadFromFile( 'c:/Circles.bmp' );
Picture.Assign( bmp );
bmp.free;
s.Free;
Picture.SaveToStream( s );
finally
Picture.Free;
end;

S.Position := 0;
Response.ContentType := 'image/bmp';
Response.ContentStream := S;
end;

procedure TWebModule1.WebModule1Create(Sender: TObject);
begin
s := TMemoryStream.create;
end;

procedure TWebModule1.WebModule1Destroy(Sender: TObject);
begin
S.destroy;
end;
 
s.Free;
Picture.SaveToStream( s );

s已经释放了,还可以saveto ?
 
呵呵, 就是s的问题
改写一下.
var
WebModule1: TWebModule1;

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest
Response: TWebResponse
var Handled: Boolean);
var
S: TMemoryStream;
sCode, sKind, sSize: string;
Kind, Size: integer;
begin
s:=tmemorystream.create;
try
s.LoadFromFile( 'c:/Circles.bmp' );
S.Position := 0;
Response.ContentType := 'image/bmp';
Response.ContentStream := S;
except
Response.contenttype:='text/html';
response.content:='some error occured';
finally
s.Free;
end;

end;

 
不好意思原码中没有s.free这句不好意思是全局变量
 
cytown: 顺便问一个问题,我现在做类似的程序,都是把现成的图片做到resource
里面,这样可以不用临时从文件里调入,我以为这样可能会快一点,不知
你老意下如何?
 
原码中只是一个例子实际我是动态产生Gif图,每时每刻产生的不一样所以不能用固定的图。
 
呜呜,
好心痛,
一个好友拿我的帐号上来,
一下就分出来200¥,
不过只要问题解决了就行了;-)

多谢cAkk,cytown,hubdog帮忙,

cAkk, 这要看情况.
程序运行时,并没有把所有的资源都调入内存中;
所有的数据都放在主程序的资源中会使主程序很庞大, 并使程序启动很慢;
可以把所有资源都放入一个Dll中;
上面的程序只是一个Demo.
 
简化一下cytown的代码:
var
S: TMemoryStream;
bmp:tbitmap;
gif:tgifimage;
begin
bmp:=tbitmap.create
//建立临时bitmap用来绘图
//....在这里进行图片的绘制工作bmp.canvas......
gif:=tgifimage.create
//建立gif文件
gif.assign(bmp)
//bmp图片赋给gif
s:=tmemorystream.create
//建立流
gif.savetostream(s)
//把gif的数据保存到流
S.Position := 0
//输出流
Response.ContentType := 'image/gif';
Response.ContentStream := S;
s.Free
//依次释放
gif.free;
bmp.free;
end;

我的经验,不要把S的创建放在OnCreate事件里面,最好是动态创建,动态释放.
最近我一直在做这样的工作,所以比较熟. :-)
 
cakk: 一般要不是大图象, 确实在res里好一些, 速度是快些, 而且不怕丢图:-)
 
而且迁移也方便,一个exe就可以了. :-)
 
小图象用IMAGE LIST呀,呵呵
 
帮"amo"分分了;)
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部