小弟最近在编程中想从编译好的dll中调用一个函数,此dll是用c++语言写好编译而成,此函数创建了一个线程专门监视串口输出,如果有就送出一个字符串,但我在c#中不会用事件对其捕捉。下面把c++的函数给出,希望大家能帮助结决如何从c#中捕获此消息而后对此消息进行处理。
函数如下:
bool StartMonitor(HANDLE hComm, HWND hOwner)
{
DWORD dwThreadId;
CommInfo.hComm = hComm;
CommInfo.hOwner = hOwner; hThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, ThreadProc, &CommInfo, 0, &dwThreadId);
if (hThread == NULL)
return false; return true;
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
COMMINFO *pCommInfo;
DWORD Bytes = 0;
DWORD BytesToRead = 0;
DWORD ErrorFlags = 0;
char CnfMsg[MAX_BUF_SIZE] = "\0";
char szReadBuf[MAX_BUF_SIZE] = "\0";
DWORD dwEvtMask = 0;
DWORD dwSignal = 0;
pCommInfo = (COMMINFO *)lpParameter;
//清除串口缓冲区
PurgeComm(pCommInfo->hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
//哪些串口事件需要监视
SetCommMask(pCommInfo->hComm, EV_ERR | EV_RLSD | EV_RING | EV_RXCHAR | EV_TXEMPTY);
while (1) {
WaitCommEvent(pCommInfo->hComm, &dwEvtMask, &Overlapped);
dwSignal = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); if (dwSignal == WAIT_OBJECT_0) {
if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {
Sleep(100);
RecvChar(pCommInfo->hComm);
if (strlen(RecvBuf) != 0) { strupr(RecvBuf);#ifdef SMS_DLL_DEBUG
sprintf(RecvDebugInfo, "<-- %s", RecvBuf);
if (strncmp(RecvBuf, "ATWITS", 6))
PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
else
if (DispFlag)
PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
#endif if (!strncmp(RecvBuf, "ATWITS+CMTI:1", 13)) {
if (pCommInfo->hOwner != NULL)
PostMessage(pCommInfo->hOwner, WM_RECVSMS, 0, 0);
}
// else if (!strncmp(RecvBuf, "ATWITS", 6)) {
// if (pCommInfo->hOwner != NULL)
// PostMessage(pCommInfo->hOwner, WM_POWERON, 0, 0);
// }
else if (strlen(RecvBuf) != 0) {
//增加临界区控制
memset(RetInfo, 0, MAX_BUF_SIZE);
strcpy(RetInfo, RecvBuf);
SetEvent(hRecvEvent);
}
memset(RecvBuf, 0, MAX_BUF_SIZE);
}
} ResetEvent(Overlapped.hEvent);
}
else if(dwSignal == WAIT_OBJECT_0 + 1) {
SendChar(pCommInfo->hComm);
}
} return 0;
}就是如上代码,想在c#中调用StartMonitor函数来对串口监视如果有PostMessage(pCommInfo->hOwner, WM_RECVSMS, 0, 0);就对其处理。希望大家不吝指教。
函数如下:
bool StartMonitor(HANDLE hComm, HWND hOwner)
{
DWORD dwThreadId;
CommInfo.hComm = hComm;
CommInfo.hOwner = hOwner; hThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, ThreadProc, &CommInfo, 0, &dwThreadId);
if (hThread == NULL)
return false; return true;
}
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
COMMINFO *pCommInfo;
DWORD Bytes = 0;
DWORD BytesToRead = 0;
DWORD ErrorFlags = 0;
char CnfMsg[MAX_BUF_SIZE] = "\0";
char szReadBuf[MAX_BUF_SIZE] = "\0";
DWORD dwEvtMask = 0;
DWORD dwSignal = 0;
pCommInfo = (COMMINFO *)lpParameter;
//清除串口缓冲区
PurgeComm(pCommInfo->hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
//哪些串口事件需要监视
SetCommMask(pCommInfo->hComm, EV_ERR | EV_RLSD | EV_RING | EV_RXCHAR | EV_TXEMPTY);
while (1) {
WaitCommEvent(pCommInfo->hComm, &dwEvtMask, &Overlapped);
dwSignal = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE); if (dwSignal == WAIT_OBJECT_0) {
if((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {
Sleep(100);
RecvChar(pCommInfo->hComm);
if (strlen(RecvBuf) != 0) { strupr(RecvBuf);#ifdef SMS_DLL_DEBUG
sprintf(RecvDebugInfo, "<-- %s", RecvBuf);
if (strncmp(RecvBuf, "ATWITS", 6))
PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
else
if (DispFlag)
PostMessage(pCommInfo->hOwner, WM_RECVDATA, 1, (LPARAM)&RecvDebugInfo);
#endif if (!strncmp(RecvBuf, "ATWITS+CMTI:1", 13)) {
if (pCommInfo->hOwner != NULL)
PostMessage(pCommInfo->hOwner, WM_RECVSMS, 0, 0);
}
// else if (!strncmp(RecvBuf, "ATWITS", 6)) {
// if (pCommInfo->hOwner != NULL)
// PostMessage(pCommInfo->hOwner, WM_POWERON, 0, 0);
// }
else if (strlen(RecvBuf) != 0) {
//增加临界区控制
memset(RetInfo, 0, MAX_BUF_SIZE);
strcpy(RetInfo, RecvBuf);
SetEvent(hRecvEvent);
}
memset(RecvBuf, 0, MAX_BUF_SIZE);
}
} ResetEvent(Overlapped.hEvent);
}
else if(dwSignal == WAIT_OBJECT_0 + 1) {
SendChar(pCommInfo->hComm);
}
} return 0;
}就是如上代码,想在c#中调用StartMonitor函数来对串口监视如果有PostMessage(pCommInfo->hOwner, WM_RECVSMS, 0, 0);就对其处理。希望大家不吝指教。
的hOwner , 然后再from的wndproc截获
类似
.... wndproc( ref message m )
{
if( m.msg == ... .)
}
我这里的HANDLE hComm 实际上是一个可用的串口,就是后面的Hwnd hOwner不知到怎么用,麻烦您能给的稍微详细点的说明吗?
,调用StartMonitor。并且要重载这个接受消息窗口的WndProc 方法,类似: // Override the default WndProc behavior to examine messages.
protected override void WndProc(ref Message msg)
{
switch(msg.Msg)
{
// If message is of interest, invoke the method on the form that
// functions as a callback to perform actions in response to the message.
case WM_CUSTOMMSG:
this.msgform.RespondToMessage((int)msg.WParam, (int)msg.LParam);
break;
}
// Call the base WndProc method
// to process any messages not handled.
base.WndProc(ref msg);
}
}
正如(高级伴读书童) (倦怠) 的介绍用c#中的this.handle赋值给howner就能够利用重载winpro函数进行消息的捕获,真心的感谢大家。