引用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();
}能够成功调用谢谢各位的帮助~~~~~~~~~~~~~~~~~
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();
}能够成功调用谢谢各位的帮助~~~~~~~~~~~~~~~~~
解决方案 »
- 将EXCEL的一列数据导入ACCESS的新字段中
- 在Delphi中怎么用“类名.方法名”也就像是VC#中的静态方法!
- 请问?函数怎样才能输出一个数组
- 如何知道客户机是否注册了midas.dll和stdvcl40.dll?是不是只要有这两个文件就行了?
- 怎么让NMStrmServ作为服务器时达到多线程的功能
- 寻求加解密字符串的函数(我现在用的这个对汉字操作总是有点错~~~)
- 好消息!!!!!!!!!!!!!!!!!!
- WINDOWS如何启动屏幕保护程序?调用哪些函数?
- dbGrid中如何单击择或取销择一行,拖动选取多行
- 请教各位大吓关于数据加密...
- 程序运行 初始化错误?
- 字符串转化为日期类型
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
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;