菜鸟问题 编写的一个 DLL 不能使用 找不到原因 (30分)

  • 主题发起人 主题发起人 cgdlin
  • 开始时间 开始时间
C

cgdlin

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下 请大虾帮忙看一看

library bmptojpg;

uses
SysUtils,
Classes,
windows,
jpeg,
extctrls;

var
aBuffer:Pointer;
procedure exampledllproc(reason:integer);
begin
if reason = dll_process_detach then begin
freemem(abuffer);
end;

end;

procedure bmptjpg(ywj,mbwj:pchar;ysl:integer);
var
image1:timage;
jp: TJpegImage;
begin
image1 := timage.Create(image1);
image1.Picture.LoadFromFile(ywj);
jp := TJpegImage.Create;
jp.CompressionQuality := ysl;
try
with jp do
begin
Assign(Image1.Picture.Bitmap);
SaveToFile(mbwj);
end;
finally
jp.Free;
image1.Free;
end;
end;
exports
bmptjpg;
{$R *.RES}

begin
dllproc := @exampledllproc;
aBuffer := allocmem(1024);
end.
 
procedure bmptjpg(ywj,mbwj:string;ysl:integer);
String类型改成pChar,否则会出n多问题的。
 
小弟试啦 不行
 
最好使用PChar,不要使用string
使用string,就uses sharemem单元
 
是不是出现地址冲突Access vo...的错误,就是这个原因。
注意使用pChar类型,需要在主程序中申请内存,和释放内存的。
GetMem(aa,255)
FreeMem(aa)
 
to yzhshi :
谢谢你!
我把修改后的代码粘上去啦。还是不行。

 
问题出在:image1 := timage.Create(image1);
这样声明是可以的
var
image1:timage;
但建立的时候可不能在自己(DLL)里面建造实例。改由宿主程序建造吧,如:
image1 := timage.Create(x);//X为宿主程序的句柄。
当然在procedure bmptjpg(ywj,mbwj:pchar;ysl:integer);中应该加一个传入参数X!
同理jp := TJpegImage.Create;也要注意这个问题。再改改看!
 
image1 := timage.Create(image1);
改成:image1 := timage.Create(nil);
 
谢谢 独帅

但是不能在 vfp 下使用此 DLL
 
这我就不清楚了,没有用过vfp
 

delphi 编写的 dll 其它语言 应该可以使用的 难道还有特别注意的地方吗?
 
没有啊。你只要按编程语言的调用方式调用就可以,没有特别的要求!
 
你上面的例子语言上还是有问题的!
[red]
将所有要调用的接口都用stdcall参数传递方式;
将所有涉及string类型的都改为Pchar。
[/red]
 
问题应该不是出在
image1 := timage.Create(image1);
因为DELPHI会将局部声明的变量自动初始化的nil,所以这句和
image1 := timage.Create(nil);是等效的。

如果这个DLL在非PASCAL的语系中使用,应该用STDCALL方式。应该在
VFP中不存在PASCAL方式的调用吧。
 
to BeginDelphi

你能说再详细点吗
 
谢谢大家!!! 问题处理啦
 
后退
顶部