在我没有把它变成dll得时候用得还是好好的。这么变成dll后就调用出错了呢?
Access violation at address 003c2841 in module 'DLLCON.DLL',
Read of address 00000038.
下面是变成DLL前的代码:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ComCtrls, SPComm;
const
  WM_COMMNOTIFY=WM_USER+1;//通讯消息
  start=chr($7E);
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    ComboBox1: TComboBox;
    Button2: TButton;
    Button3: TButton;
    ComboBox2: TComboBox;
    Comm1: TCommm;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  RichEdit1:TRichEdit;
  dcb:TDCB;
  ComName:pchar;
  DayTime,PassTime:TDatetime;
  PerCode,Address,DoorKey,apply,nPerson,nOpenCount,TT:integer;
  bagsize:char;
  BoardID,Name,MDelay,SupOrder,Edition,Dactylogram:shortstring;
  s0,s1,s2,s3,s4,s5,bagnumber:shortstring;
  r0,r1,r2,Raddress,r3,r4:shortstring;
  Send,Receive:string;
function SetNetID(BoardID:integer;Address:integer):BOOL;StdCall;//设置门禁机网络地址号implementation{$R *.dfm}
//发送数据
procedure Transmit;
var
  i,count:integer;
  commflg:boolean;
  sbuf:array of byte;
begin
  commflg:=true;
  count:=Length(Send);
  setLength(sbuf,count);
  for i:=1 to count do
    begin
    sbuf[i]:=byte(Send[i]);
      if not Form1.Comm1.WriteCommData(@sbuf,1) then
      begin
        commflg:=false;
        break;
      end;
        sleep(2);
    end;
    if not commflg then
      MessageDlg('发送失败!',mterror,[mbyes],0);
end;//接收处理
procedure ReadData;
var
  buffer:Pointer;
  BufferLength:Word;
begin
  SetLength(Receive,BufferLength);
  Move(Buffer^,PChar(Receive)^,BufferLength);
end;Function SetNetID(BoardID:integer;Address:integer):BOOL;//设置门禁机网络逻辑地址号
begin
     bagsize:=chr($04);
     s0:=start;
     s1:=start;
     s2:=chr($4f);
     s3:=chr(Address);
     s4:=bagsize;
     s5:=chr(BoardID);
     Send:=s0+s1+s2+s3+s4+s5;
     Transmit;     ReadData;
     Raddress:=r3;
     r0:=copy(Receive,1,1);
     r1:=copy(Receive,2,1);
     r2:=copy(Receive,3,1);
     r3:=copy(Receive,4,1);
     bagnumber:=copy(Receive,5,2);
if r0+r1=start+start then
   if r2=chr($5f) then
      Result:=true
      else if r2=chr($7f) then
           Result:=false 
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  setnetid(strtoint(combobox1.Text),strtoint(edit1.Text));
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  Comm1.StartComm;
  Comm1.CommName:=ComboBox2.Text;
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  Comm1.StopComm;
end;end.
变成DLL后的代码为:
unit ComFuc;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, SPComm;type
  TForm1 = class(TForm)
    Comm1: TCommm;
  private
    { Private declarations }
  public
    { Public declarations }
  end;const
     start=chr($7E);
var
     Form1: TForm1;
     Comm1: TCommm;
     DayTime,PassTime:TDatetime;
     PerCode,Address,DoorKey,apply,nPerson,nOpenCount,TT:integer;
     bagsize:char;
     BoardID,Name,MDelay,SupOrder,Edition,Dactylogram:shortstring;
     s0,s1,s2,s3,s4,s5,bagnumber:shortstring;
     r0,r1,r2,Raddress,r3,r4:shortstring;
     Send,Receive:string;
{ Declare the export function 宣布Form函数出口}
function OpenCom(Comname:shortstring):BOOL;StdCall; //打开串口
function CloseCom:BOOL;StdCall;//关闭串口
function SetNetID(BoardID:integer;Address:integer):BOOL;StdCall;//设置门禁机网络地址号
implementation{$R *.dfm}procedure Transmit;
var
  i,count:integer;
  commflg:boolean;
  sbuf:array of byte;
begin
  commflg:=true;
  count:=Length(Send);
  setLength(sbuf,count);
  for i:=1 to count do
    begin
    sbuf[i]:=byte(Send[i]);
      if not Comm1.WriteCommData(@sbuf,1) then
      begin
        commflg:=false;
        break;
      end;
        sleep(2);
    end;
    if not commflg then
      MessageDlg('发送失败!',mterror,[mbyes],0);
end;procedure ReadData;
var
  buffer:Pointer;
  BufferLength:Word;
begin
  SetLength(Receive,BufferLength);
  Move(Buffer^,PChar(Receive)^,BufferLength);
end;Function OpenCom(Comname:shortstring):BOOL;//打开串口
begin
  Comm1.StartComm;
  Comm1.CommName:=Comname;
end;Function CloseCom:BOOL;//关闭串口
begin
   Comm1.StopComm;
end;Function SetNetID(BoardID:integer;Address:integer):BOOL;//设置门禁机网络逻辑地址号
begin
     bagsize:=chr($04);
     s0:=start;
     s1:=start;
     s2:=chr($4f);
     s3:=chr(Address);
     s4:=bagsize;
     s5:=chr(BoardID);
     Send:=s0+s1+s2+s3+s4+s5;
     Transmit;     ReadData;
     Raddress:=r3;
     r0:=copy(Receive,1,1);
     r1:=copy(Receive,2,1);
     r2:=copy(Receive,3,1);
     r3:=copy(Receive,4,1);
     bagnumber:=copy(Receive,5,2);
if r0+r1=start+start then
   if r2=chr($5f) then
      Result:=true
      else if r2=chr($7f) then
           Result:=false
else result:

解决方案 »

  1.   

    谁有成功的DLL编写经验,共享一下。。
    麻烦各位高手了。。特别是有关内存分配的~~~~~~~~~~~~~~~~~~~~~~~~  
      我们约好一起去看雪!
    ☆★○●◎◇◆□■△▲※
      

  2.   

    那谁可以告诉我哪有这DLL方面的专业书籍,帮我介绍一两本。。
    看书,我还是很有时间的。。~~~~~~~~~~~~~~~~~~~~~~~~  
      我们约好一起去看雪!
    ☆★○●◎◇◆□■△▲※
      

  3.   

    我用API函数也作了一个,还是有相同的问题。。我想这肯定是我没有看到的,希望高手能指点。哪怕你给我看看你们以前编写的DLL中用的shareMem
    getmem我都误所谓,只要你们的调用成功,我能根据你们的依葫芦画瓢完成我的
    是不是我想的太美了,呵呵
    我一直都菜~~~~~~~~~~~~~~~~~~~~~~~~  
      世界因为你我而年轻!
    ☆★○●◎◇◆□■△▲※
      

  4.   

    library Project2;uses
      SysUtils,
      Classes;{$R *.RES}begin
    //这里写代码,如果包括了窗体,在uses里面加上窗体的单元名称
    //我知道好象是这样的, 但我忘记了.
    end.
      

  5.   

    哪有你这样的dll,给个非常简单明了的例子你看看。library Project2;
    uses
      SysUtils,
      Classes,
      Dialogs;{$R *.RES}procedure test;
    begin
     ShowMessage('kk');
    end;
    exports
     test;
    begin
    end.
      

  6.   

    哈哈哈,我写的是DLL的引用单元啊。。
    呵呵
      

  7.   

    函数要用stdcall还是safecall试试,我忘了是哪一个了