现在的问题是一调用的时候就出现了
Access violation at address 003c2841 in module 'DllCON.dll',Read of address 00000038.
这样的错误。其中DLLCON.DLL是我编写的。请问一般要怎么解决阿。

解决方案 »

  1.   

    可能是你的函数的变量或返回值使用String类型的数据了!!!
      

  2.   

    是阿,用string不行吗???
    要怎么改,,大哥们
      

  3.   

    改用PChar就解决了
    只要挂关系到参数的都用PChar
    一定
    你看看新建一个DLL Wizard时系统给出的提示就知道了。
    不过还是建议用PChar而不用ShareMem
      

  4.   

    注意
     1 dll中输出的函数加上stdcall
     2 声明时加上stdcall================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  5.   

    谢谢你的回答
    是不是我这样改阿。
    以前定义的string类型全部改为pchar就可以了阿
      

  6.   

    还有就是whlwyl(昨夜星辰)说的函数声明加上stdcall
    如果函数要输出,声明处最好写上export
      

  7.   

    我用了StdCall阿,这些我都用了是不是我改成pchar或者shortstring就好了阿 
    你们有碰到过这样的问题吗??
    ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  8.   

    是的
    我以前刚开始的时候就遇到了这个问题
    在DLL中一定使用PChar这种类型
    如果你用PChar作为函数返回类型,请先使用GetMem分配内存
    比如
    GetMem(Result, 255);
    如果你用VB调用这种函数
    使用之前也一定要分配一下String的长度
    比如
    Dim Ret as String
    Ret = String(255, VbNull)
      

  9.   

    如果你用string的话,可以dll的工程文件和调用她的工程文件里都加上
    uses ShareMem  要写在第一个
      

  10.   

    * 用Pchar也不一定保证不出问题. *
    我最近也被DLL返回值的问题搞得焦头烂额,有谁能顺便解决我这个问题,我也奉上100分.(请不要告诉我使用ShareMem,我只想知道我这样写有什么问题)
    例如:
    在DLL中:
    //*其中省略了 DLL Form创建和销毁的函数,我认为是没有问题的
    ......
    Function Get_Change:PChar; stdcall;
    var tmp:string;
    begin
      tmp:=inttostr(Calendar1.Year)+#13#10+
           inttostr(Calendar1.Month)+#13#10+
           inttostr(Calendar1.Day);
      Result:=PChar(tmp);
    end;而调用文件:
    ....
    Type
     TPlugInChanged = Function ():PChar; stdcall;
    ......
    var
      Parent_Handle:THandle;
    ......procedure TForm1.Button1Click(Sender: TObject);
    var Loader:TPlugInChanged;
    begin
       if Plugin_library=0 then
         Plugin_library:=LoadLibrary(PChar(edit1.text));
       if PLugin_Library = 0 then  begin 
           ShowMessage('Can Not Load '+edit1.text); exit; 
       end;
       try
          @Loader:=GetProcaddress(PLugin_Library,'Get_Change');      if @Loader<>nil then memo1.Lines.Add(Loader)
          else memo1.Lines.Add('--> InterFace Function Error');
       except freelibrary(PLugin_Library);  Plugin_library:=0;
         memo1.Lines.Add('Free Library'); 
       end;
    end;
      

  11.   

    ShareMem一定要加在Project部分(菜单:Project/View Source),
    并且放在第一个。
      

  12.   

    现在我的string 类型全部改为了shortstring类型,
    还是有上面的错误。不过第一个号码变了一点,变成了002827D5 了,这样是进步了还是退步了阿。呵呵
      

  13.   

    用PChar作为返回参数
    先使用GetMem分配内存,不然肯定会出错的
      

  14.   

    是不是每一个pchar,shortstring前都要getmem啊,
    能不那个给我举个例子??一小段代码就可以了
      

  15.   

    我要问dll内存分配问题,下面是我的一小段代码请问怎么分内存
    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[i],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^,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
    end;
    顺便问一下,怎么给分给别人,自己怎么赚分~~~~~~~~~~~~~~~~~~~~~~~~
      
      我们约好一起去看雪!☆★○●◎◇◆□■△▲※