调用.dll文件的问题,这段代码不知为什么出错。(50分)

  • 主题发起人 devexpress
  • 开始时间
D

devexpress

Unregistered / Unconfirmed
GUEST, unregistred user!
我在.rc文件里是这么写的。 
Mypic Rcdata "c:/windows/desktop/a.jpg"
编译成pic.res

新建了一个.dll
library Project2;


uses
SysUtils,
Classes;
{$R Pic.res }
end.


在程序里调用
uses jpeg//

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
Stream:TResourceStream;
MyJpg: TJpegImage;
h: THandle;
begin
h := LoadLibrary('Project2.DLL');
if h <>0 then
ShowMessage('Bad Dll Load')
else begin
Stream := TResourceStream.Create //执行到这出错(Hinstance,'Mypic',RT_RCDATA) ;
MyJpg:=TJpegImage.Create;
MyJpg.LoadFromStream (Stream) ;
Image1.Picture.Assign(MyJpg);
MYJPG.FREE;
FreeLibrary(h);
end;

end;

end.
 
else begin
Stream := TResourceStream.Create (Hinstance,'Mypic',RT_RCDATA) ;//执行到这出错 没有找到mypic这个资源
 
帮忙看一下,谢了
 
Stream := TResourceStream.Create (Hinstance,'Mypic',RT_RCDATA) ;//执行到这出错 没有找到mypic这个资源

应该是找不到的,Hinstance是你exe的,你的资源在dll里面,把hinstance改成h试试
 
h = 0才是LoadLibrary失败吧?
 
有经验就是有经验,问题解决。

hinstance和h还有其它的参数吗? 是啥意思呢? 谢了

 
 
我们是这样调用dll的
procedure TForm1.Button1Click(Sender: TObject);
var
FunHandle:THandle;
UserPWD:string;
EncryptPWD:Function(Tmp:widestring):widestring;stdcall;
begin
if Edit1.text='' then Exit;
FunHandle:=LoadLibrary('Password.dll');
@EncryptPWD:=GetProcAddress(FunHandle,'EncryptPWD') ;
if @EncryptPWD<>nil then
begin
UserPWD:=EncryptPWD(widestring(Edit1.Text));
end;
Edit2.Text:=UserPWD;

end;
 
hInstance是表示你当前文件的句柄
你的TResourceStream.Create使用的句柄是你资源文件句柄
由于你的hInstance没有这个资源所以失败
改成你那个资源文件的句柄就行了
 
h = 0是我写反了,我换过来了,就行了。

h是我自己创建的资源句柄,我明白了。 谢谢楼上两位。

 
恭喜你了!!我就不费心了!
 
多人接受答案了。
 
顶部