引用DLL中的函数:
function ReadMultiBlock(buf:pByte; block:Byte; cnt:Byte; opmode:us8):Integer; stdcall; external 'CMC151.dll';
buf的类型有可能为 pChar(这里不能够太确定)我的delphi中的内容为:
procedure TForm1.Button2Click(Sender: TObject);
var
ret:integer;
ss:string;
s: Array[1..24] of Char;
dat:Pbyte;
beginret:=ReadMultiBlock(dat,1,6,0);
 CopyMemory(@s[1],dat,24);  //运行到这里时出问题.
end;错误信息为:
Priject Project1.exe raised exception class EAccess Violation with message
'Access violation at adress 0038767B in module 'CMC151.dll'.Write of address
'004280B4',Process stopped.Use Step or Run to continue.
但是在VC++里面能够成功调用这个DLL.VC++代码里面调用该DLL的代码为:void CCMC151Dlg::OnButton6() 
{
   if(!hDll)LoadDLL();
   UpdateData(true);
   icdata="";
   px="";
   xz="";
   zend="";
   comport=checkbox.GetCurSel()+1;
   retval=retport(comport);
   if (retval!=RET_OK)
{
     this->GetDlgItem(IDC_EDIT16)->SetWindowText("Comport number error");
 return;
}
     us8 mode = NonAddressedMode;
     int start = 1;//ItemIndex ;
     int cnt = 8;//cmbBlockCount->ItemIndex + 1;
     if(start + cnt > MAX_BLOCK_CNT)
     {
      AfxMessageBox("戈犯 !");
      return;
     }
 CString ICstatus;
     uc8 dat[30];
 memset(dat,0,30 );
 retval=_ReadMultiBlock(dat,start,cnt, mode);      
     if (retval==RET_OK)
 {
 icdata = CString((char*)dat);
     UpdateData(false);
 char shuzu[30];
 UpdateData(true);
 strncpy(shuzu,icdata,30);
      for (int i=0;i<30;i++)
  {
       if (shuzu[i]=='P')
   {   
char s1;
for(int j=i+1;j<30;j++)
{
    if (shuzu[j]=='X')
 break;
 s1=shuzu[j];
 px+=s1;
}
   }
if (shuzu[i]=='X')
{   
 char s2;
 for(int j=i+1;j<30;j++)
 {
    if (shuzu[j]=='Z')
  break;
  s2=shuzu[j];
  xz+=s2;
 }
}
if (shuzu[i]=='Z')
{   
    char s3;
  for(int j=i+1;j<30;j++)
  {
if (shuzu[j]=='\0')
break;
s3=shuzu[j];
    zend+=s3;
  }
}
  }   
  ICstatus=GetRetStr(retval);
  GetDlgItem(IDC_EDIT16)->SetWindowText(ICstatus);
 }
 else
 {
 ICstatus=GetRetStr(retval);
 GetDlgItem(IDC_EDIT16)->SetWindowText(ICstatus);
 }
UpdateData(false);
   _CloseComport();
}能够成功调用谢谢各位的帮助~~~~~~~~~~~~~~~~~

解决方案 »

  1.   

    别人VC++中调用该DLL的引用为:typedef int WINAPI  ReadSingleBlock(uc8* buf,byte block,us8 opmode);
    typedef int WINAPI  WriteSingleBlock(uc8* id,uc8* buf,byte block,us8 opmode);
    typedef int WINAPI  ReadMultiBlock(uc8* buf,byte block,byte cnt,us8 opmode);DLL中的
    #define uc8 unsigned char
    #define us8 unsigned short
      

  2.   

    在delphi 里面
    procedure TForm1.Button2Click(Sender: TObject); 
    var 
    ret:integer; 
    ss:string; 
    s: Array[1..24] of Char; 
    dat:pchar; 
    begin 
    dat:=@s;
    ret:=ReadMultiBlock(dat,1,6,0); 
    s[24]:=#0;//将s变成一个字符串..
    然后后面的操作都对s数组....          //CopyMemory(@s[1],dat,24);  //运行到这里时出问题. 
    end;