用VC写的动态库里的函数用DELPHI调用不能在XP系统里正常使用,但是在98和2000系统是完全正常的,没有任何问题(100分)

  • 主题发起人 主题发起人 dsqyytmf
  • 开始时间 开始时间
D

dsqyytmf

Unregistered / Unconfirmed
GUEST, unregistred user!
我用VC6.0写了一个动态库.在2000和98系统里用delphi写的程序都可以正常调用该DLL,但是在XP系统里就有几个函数调用不成功.其他函数都可以正常使用.这几个不能使用的函数唯一区别就是有这样的处理,这是一串发送到硬件里的命令.不知有谁碰到过这样的问题没有?
Output[0] = 0x2E;
Output[1] = 0x02;
Output[2] = Tnum/256;
Output[3] = Tnum%256;
Output[4] = (Output[0]+Output[1]+Output[2]+Output[3])/256;
Output[5] = (Output[0]+Output[1]+Output[2]+Output[3])%256;
 
有人碰到过这样的问题没.能帮我解决这个问题的还可以另加分.请大侠们帮帮忙
 
既然“2000和98系统里用delphi写的程序都可以正常调用该DLL”,“XP系统里有几个函数调用不成功”可能不是 DLL调用的问题。估计是硬件操作的权限问题。
 
谢谢kaida
我的硬件就是一台考勤机.但是在XP系统里用串口调试工具对那几个命令进行操作是没有问题的.硬件的权限问题是什么意思?
 
我估计不应该是系统的差异造成的,八成还是那个VC写的DLL的问题,在98,2K下没问题
不一定说明这个DLL没问题。如果你那个DLL只是通过串口与考勤机通信的话,那么XP下
也不应该有问题,不过如果你用了其他的什么东西就不好说了。
 
我也想应该是DLL的问题,可是那些函数的不同之处就是有把数量下载下去了.像TNUM就是把用户数量下载到考勤机.数量是用两个字节表示的.其他就都是一样的了,只是通信的命令不同.
 
很有可能是指针问题,不过,没代码不好说,如果你能把调用失败的函数贴出来
可以找找看
 
是DELPHI的调用函数代码还是VC动态库里的函数代码?
 
extern "C" short APIENTRY
DowntimeT(BYTE nPort, BYTE macno)
{
unsigned long nBYTEs;
BYTE Output[128];
BYTE Input[128];
DWORD dwErrors = 0;
DWORD dwBYTEsWritten;
DWORD dwBYTEsRead;
BOOL bReturn;
DWORD dwErrorFlags;
COMSTAT ComStat;
int i;
if(HandShake(nPort,macno,1)!=0) return -1;

CloseCommDev(nPort);
InitCommDev(nPort,'n');

Output[0] = 0x2A;
Output[1] = 0x01;
Output[2] = 0x08;//时间段数量为8;
Output[3] = (Output[0]+Output[1]+Output[2])/256;//校验码
Output[4] = (Output[0]+Output[1]+Output[2])%256;//校验码
nBYTEs=5;
m_OverlappedWrite.Offset=0;
m_OverlappedWrite.OffsetHigh=0;
ClearCommError(hCommDev,&dwErrors,NULL);
PurgeComm(hCommDev, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);

bReturn = WriteFile(hCommDev,Output,nBYTEs,&dwBYTEsWritten,&m_OverlappedWrite);
if (!bReturn) {
ClearCommError(hCommDev,&dwErrors,NULL);
Sleep(200);
CloseCommDev(nPort);
return -1;
}

if (nBYTEs!=dwBYTEsWritten) {CloseCommDev(nPort);
return -1;}

Sleep(200);

for (i=0;i<999999;i++)
{
ClearCommError(hCommDev,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue>0)
{
dwBYTEsRead=min(2,ComStat.cbInQue);
if(dwBYTEsRead>0)
bReturn = ReadFile(hCommDev,Input,1,&dwBYTEsRead,NULL);
if (!bReturn) {
ClearCommError(hCommDev,&dwErrors,NULL);
Sleep(200);
CloseCommDev(nPort);
return -1;
}
if( Input[0] != macno){
Sleep(200);
CloseCommDev(nPort);
return -1;
}
else
{
EndComm(0);
return 0;
}
}
}

return -1;
}
 
这是一个下载时间段的函数代码.请看看.谢谢
 
感觉可能跟延时有关,[:(]
下面这段代码中bReturn 为False未必表示失败,你还要进一步检查GetLastError
是不是ERROR_IO_PENDING。
bReturn = WriteFile(hCommDev,Output,nBYTEs,&dwBYTEsWritten,&m_OverlappedWrite);
if (!bReturn) {
ClearCommError(hCommDev,&dwErrors,NULL);
Sleep(200);
CloseCommDev(nPort);
return -1;
}
 
每次我在XP里调用那几个函数时就会返回一个很大的数值.像212151976等的
 
不懂 学习.........
 
我来接分了
 
接受答案了.
 
后退
顶部