Winapi 如何将长整型转换为字符 #包括 #包括 #包括 使用名称空间std; HANDLE hPort=CreateFile(“COM2”, GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); DCB-DCB; 布尔写字节(字符*数据) { 德沃德·拜特斯莱特; 如果(!GetCommState(hPort和dcb)) { printf(“\n串行端口无法打开\n”); 返回false; } dcb.BaudRate=CBR_9600; dcb.ByteSize=8; dcb.奇偶性=无奇偶性; dcb.StopBits=一个StopBits; 如果(!SetCommState(hPort和dcb)) 返回false; bool retVal=WriteFile(hPort,data,1,&byteswrited,NULL); 返回返回; } int ReadByte() { int-Val; 字节; DWORD DWBYTEST转让; 德沃德·德沃德·德克莫德姆斯塔特斯; 如果(!GetCommState(hPort和dcb)) 返回0; 设置通信掩码(hPort,EV|RXCHAR | EV|ERR); WaitCommEvent(hPort和dwCommModemStatus,0); if(dwCommModemStatus和EV_RXCHAR) ReadFile(hPort,&Byte,1,&dwbytesttransfered,0); Val=字节; 返回Val; } int main(){ p点; int x; int-y; intz; 而(0==0){ GetCursorPos&p; x=p.x; y=p.y; HDC-HDC; hDC=GetDC(空); cin>>z; 您为什么在发布hDC后使用它 #include <iostream> #include <Windows.h> #include <string> using namespace std; HANDLE hPort = CreateFile("COM2", GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); DCB dcb; bool writebyte(char*data) { DWORD byteswritten; if (!GetCommState(hPort,&dcb)) { printf("\nSerial port can't be open\n"); return false; } dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; if (!SetCommState(hPort,&dcb)) return false; bool retVal = WriteFile(hPort,data,1,&byteswritten,NULL); return retVal; } int ReadByte() { int Val; BYTE Byte; DWORD dwBytesTransferred; DWORD dwCommModemStatus; if (!GetCommState(hPort,&dcb)) return 0; SetCommMask(hPort,EV_RXCHAR | EV_ERR); WaitCommEvent (hPort,&dwCommModemStatus,0); if (dwCommModemStatus & EV_RXCHAR) ReadFile (hPort,&Byte,1,&dwBytesTransferred,0); Val = Byte; return Val; } int main() { POINT p; int x; int y; int z; while(0==0){ GetCursorPos(&p); x = p.x; y = p.y; HDC hDC; hDC = GetDC(NULL); cin >> z; cout << GetPixel(hDC, x, y) << endl; Sleep(z); ReleaseDC(NULL, hDC); char data = GetPixel(hDC, x, y); if (writebyte(&data)) cout <<" DATA SENT.. " << (int)data<< "\n"; } }
出现错误时,Winapi 如何将长整型转换为字符 #包括 #包括 #包括 使用名称空间std; HANDLE hPort=CreateFile(“COM2”, GENERIC_WRITE | GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); DCB-DCB; 布尔写字节(字符*数据) { 德沃德·拜特斯莱特; 如果(!GetCommState(hPort和dcb)) { printf(“\n串行端口无法打开\n”); 返回false; } dcb.BaudRate=CBR_9600; dcb.ByteSize=8; dcb.奇偶性=无奇偶性; dcb.StopBits=一个StopBits; 如果(!SetCommState(hPort和dcb)) 返回false; bool retVal=WriteFile(hPort,data,1,&byteswrited,NULL); 返回返回; } int ReadByte() { int-Val; 字节; DWORD DWBYTEST转让; 德沃德·德沃德·德克莫德姆斯塔特斯; 如果(!GetCommState(hPort和dcb)) 返回0; 设置通信掩码(hPort,EV|RXCHAR | EV|ERR); WaitCommEvent(hPort和dwCommModemStatus,0); if(dwCommModemStatus和EV_RXCHAR) ReadFile(hPort,&Byte,1,&dwbytesttransfered,0); Val=字节; 返回Val; } int main(){ p点; int x; int-y; intz; 而(0==0){ GetCursorPos&p; x=p.x; y=p.y; HDC-HDC; hDC=GetDC(空); cin>>z; 您为什么在发布hDC后使用它 #include <iostream> #include <Windows.h> #include <string> using namespace std; HANDLE hPort = CreateFile("COM2", GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); DCB dcb; bool writebyte(char*data) { DWORD byteswritten; if (!GetCommState(hPort,&dcb)) { printf("\nSerial port can't be open\n"); return false; } dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; if (!SetCommState(hPort,&dcb)) return false; bool retVal = WriteFile(hPort,data,1,&byteswritten,NULL); return retVal; } int ReadByte() { int Val; BYTE Byte; DWORD dwBytesTransferred; DWORD dwCommModemStatus; if (!GetCommState(hPort,&dcb)) return 0; SetCommMask(hPort,EV_RXCHAR | EV_ERR); WaitCommEvent (hPort,&dwCommModemStatus,0); if (dwCommModemStatus & EV_RXCHAR) ReadFile (hPort,&Byte,1,&dwBytesTransferred,0); Val = Byte; return Val; } int main() { POINT p; int x; int y; int z; while(0==0){ GetCursorPos(&p); x = p.x; y = p.y; HDC hDC; hDC = GetDC(NULL); cin >> z; cout << GetPixel(hDC, x, y) << endl; Sleep(z); ReleaseDC(NULL, hDC); char data = GetPixel(hDC, x, y); if (writebyte(&data)) cout <<" DATA SENT.. " << (int)data<< "\n"; } },winapi,Winapi,出现错误时,GetPixel将返回-1(CLR\u INVALID) 顺便说一下,COLORREF不是char,因此在char data中存储GetPixel的返回值时会丢失信息。您应该存储完整的COLORREF并发送/接收其所有字节(因此发送/接收sizeof(COLORREF)字节) 还要注意字节顺序。如果要在两台机器之间传输多字节数据,则必须确保两台机器在字节顺序上一致。例如,如果一台机器是小端字节,另一台是大端字节,则它们在内存中以不同的字节顺序存储COLORREF。一台是在内存中存储C
GetPixel
将返回-1(CLR\u INVALID
)
顺便说一下,COLORREF
不是char
,因此在char data
中存储GetPixel
的返回值时会丢失信息。您应该存储完整的COLORREF
并发送/接收其所有字节(因此发送/接收sizeof(COLORREF)
字节)
还要注意字节顺序。如果要在两台机器之间传输多字节数据,则必须确保两台机器在字节顺序上一致。例如,如果一台机器是小端字节,另一台是大端字节,则它们在内存中以不同的字节顺序存储
COLORREF
。一台是在内存中存储COLORREF 0x00BBGGRRy作为{0,0xbb,0xgg,0xrr}
而另一个存储它作为{0xrr,0xgg,0xbb,0}
。因此,您需要定义传输字节顺序,双方独立于主机字节顺序使用。如果您不想发明新的轮子,可以查看网络字节顺序并重新使用。Socket API为您提供了一些函数,如ntohl
和htonl
,帮助您将主机字节顺序转换为网络字节顺序,反之亦然。为什么在释放hDC后要使用它
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
HANDLE hPort = CreateFile("COM2",
GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
DCB dcb;
bool writebyte(char*data)
{
DWORD byteswritten;
if (!GetCommState(hPort,&dcb))
{
printf("\nSerial port can't be open\n");
return false;
}
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(hPort,&dcb))
return false;
bool retVal = WriteFile(hPort,data,1,&byteswritten,NULL);
return retVal;
}
int ReadByte()
{
int Val;
BYTE Byte;
DWORD dwBytesTransferred;
DWORD dwCommModemStatus;
if (!GetCommState(hPort,&dcb))
return 0;
SetCommMask(hPort,EV_RXCHAR | EV_ERR);
WaitCommEvent (hPort,&dwCommModemStatus,0);
if (dwCommModemStatus & EV_RXCHAR)
ReadFile (hPort,&Byte,1,&dwBytesTransferred,0);
Val = Byte;
return Val;
}
int main() {
POINT p;
int x;
int y;
int z;
while(0==0){
GetCursorPos(&p);
x = p.x;
y = p.y;
HDC hDC;
hDC = GetDC(NULL);
cin >> z;
cout << GetPixel(hDC, x, y) << endl;
Sleep(z);
ReleaseDC(NULL, hDC);
char data = GetPixel(hDC, x, y);
if (writebyte(&data))
cout <<" DATA SENT.. " << (int)data<< "\n";
}
}
出现错误时,GetPixel
将返回-1(CLR\u INVALID
)
顺便说一下,COLORREF
不是char
,因此在char data
中存储GetPixel
的返回值时会丢失信息。您应该存储完整的COLORREF
并发送/接收其所有字节(因此发送/接收sizeof(COLORREF)
字节)
还要注意字节顺序。如果要在两台机器之间传输多字节数据,则必须确保两台机器在字节顺序上一致。例如,如果一台机器是小端字节,另一台是大端字节,则它们在内存中以不同的字节顺序存储
COLORREF
。一台是在内存中存储COLORREF 0x00BBGGRRy作为{0,0xbb,0xgg,0xrr}
而另一个存储它作为{0xrr,0xgg,0xbb,0}
。因此,您需要定义传输字节顺序,双方独立于主机字节顺序使用。如果您不想发明新的轮子,可以查看网络字节顺序并重新使用。Socket API为您提供了一些函数,如ntohl
和htonl
,帮助您将主机字节顺序转换为网络字节顺序,反之亦然。GetPixel返回一个COLORREF,不要假装它是一个char。当您尝试将一个大整数作为一个字节发送时,您期望发生什么?由于COLORREF是4个字节,您需要调用writebyte 4次才能发送它。@wipw可能更愿意重写writebyte,以便它可以发送多个byteGetPixel返回一个COLORREF,不要假装它是一个字符。当你试图将一个大整数作为一个字节发送时,你期望发生什么?因为COLORREF是4个字节,你需要调用writebyte 4次才能发送它。@wipw可能更愿意重写writebyte,这样它就可以发送多个字节,我已经看过代码了,我在想我真的很蠢,竟然问这个问题..哈哈..无论如何,谢谢大家..@user2201682当你看不到明显的(错误)时,我们不是都知道这些情况吗?:-)如果你测试了我的建议我想我的帖子是在回答你的问题,那么请接受。现在我已经阅读了代码,我想我问这个问题真的很愚蠢……哈哈……无论如何,谢谢大家。@user2201682当你看不到明显的(bug)时,我们不都知道这些情况吗?:-)如果你测试了我的建议如果你认为我的帖子回答了你的问题,那么请接受它。