DLL中建立socket连接,一般在DLL_PROCESS_ATTACH中进行初始化,可是却出现了Access Violation的错误,百思不得其解,请各位高手帮帮分析!#include "stdafx.h"
#include <afxdllx.h>
#include <winsock2.h>
#include <ws2tcpip.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif#pragma data_seg("mydata")
HHOOK glhCallWndHook = NULL;
HINSTANCE glhInstance = NULL;
#pragma data_seg() LRESULT WINAPI CallWndHookProc(int nCode, WPARAM wParam, LPARAM lParam);extern "C" _declspec(dllexport) BOOL StartHook();
extern "C" _declspec(dllexport) BOOL StopHook();int dstSocket;
char* toSendText;
static AFX_EXTENSION_MODULE PipeTestHookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("PIPETESTHOOK.DLL Initializing!\n");
if (!AfxInitExtensionModule(PipeTestHookDLL, hInstance))
return 0; new CDynLinkLibrary(PipeTestHookDLL);
glhInstance = hInstance;
//window-self's setting
WSADATA data;
WSAStartup(MAKEWORD(2, 0), &data);
unsigned short port = 9876;
struct sockaddr_in dstAddr;
memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_port = htons(port);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); dstSocket = socket(AF_INET, SOCK_STREAM, 0);
connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr)); send(dstSocket, toSendText, strlen(toSendText)+1, 0);//此处发生错误,但是不知道为什么??
}
else if (dwReason == DLL_PROCESS_DETACH)
{
closesocket(dstSocket);
WSACleanup();
TRACE0("PIPETESTHOOK.DLL Terminating!\n");
AfxTermExtensionModule(PipeTestHookDLL);
}
return 1; // ok
}//start hook
extern "C" _declspec(dllexport) BOOL StartHook()
{
BOOL bResult=FALSE;
if( glhCallWndHook == NULL )
glhCallWndHook = SetWindowsHookEx( WH_CALLWNDPROC, CallWndHookProc, glhInstance, 0 ); if(glhCallWndHook!=NULL)
bResult=TRUE;
return bResult;
}extern "C" _declspec(dllexport) BOOL StopHook()
{
BOOL bResult=FALSE; if (glhCallWndHook)
{
bResult= UnhookWindowsHookEx(glhCallWndHook);
if(bResult)
glhCallWndHook = NULL;
} return bResult;
}LRESULT WINAPI CallWndHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT *pEvent = (CWPSTRUCT *)lParam; if (nCode == HC_ACTION)
{
switch (pEvent->message)
{
case WM_SETFOCUS:
case WM_MOVE:
case WM_SYSCOMMAND:
char capt[128], temp[512];
HWND hookWnd;
hookWnd = pEvent->hwnd;
GetWindowText( hookWnd, capt, 512);
wsprintf(temp, "FocusWnd = %d, WndCaption = %s", hookWnd, capt);
strcpy(toSendText, temp); break; default:
break;
}
} return CallNextHookEx(glhCallWndHook,nCode,wParam,lParam);}
#include <afxdllx.h>
#include <winsock2.h>
#include <ws2tcpip.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif#pragma data_seg("mydata")
HHOOK glhCallWndHook = NULL;
HINSTANCE glhInstance = NULL;
#pragma data_seg() LRESULT WINAPI CallWndHookProc(int nCode, WPARAM wParam, LPARAM lParam);extern "C" _declspec(dllexport) BOOL StartHook();
extern "C" _declspec(dllexport) BOOL StopHook();int dstSocket;
char* toSendText;
static AFX_EXTENSION_MODULE PipeTestHookDLL = { NULL, NULL };extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("PIPETESTHOOK.DLL Initializing!\n");
if (!AfxInitExtensionModule(PipeTestHookDLL, hInstance))
return 0; new CDynLinkLibrary(PipeTestHookDLL);
glhInstance = hInstance;
//window-self's setting
WSADATA data;
WSAStartup(MAKEWORD(2, 0), &data);
unsigned short port = 9876;
struct sockaddr_in dstAddr;
memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_port = htons(port);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); dstSocket = socket(AF_INET, SOCK_STREAM, 0);
connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr)); send(dstSocket, toSendText, strlen(toSendText)+1, 0);//此处发生错误,但是不知道为什么??
}
else if (dwReason == DLL_PROCESS_DETACH)
{
closesocket(dstSocket);
WSACleanup();
TRACE0("PIPETESTHOOK.DLL Terminating!\n");
AfxTermExtensionModule(PipeTestHookDLL);
}
return 1; // ok
}//start hook
extern "C" _declspec(dllexport) BOOL StartHook()
{
BOOL bResult=FALSE;
if( glhCallWndHook == NULL )
glhCallWndHook = SetWindowsHookEx( WH_CALLWNDPROC, CallWndHookProc, glhInstance, 0 ); if(glhCallWndHook!=NULL)
bResult=TRUE;
return bResult;
}extern "C" _declspec(dllexport) BOOL StopHook()
{
BOOL bResult=FALSE; if (glhCallWndHook)
{
bResult= UnhookWindowsHookEx(glhCallWndHook);
if(bResult)
glhCallWndHook = NULL;
} return bResult;
}LRESULT WINAPI CallWndHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPSTRUCT *pEvent = (CWPSTRUCT *)lParam; if (nCode == HC_ACTION)
{
switch (pEvent->message)
{
case WM_SETFOCUS:
case WM_MOVE:
case WM_SYSCOMMAND:
char capt[128], temp[512];
HWND hookWnd;
hookWnd = pEvent->hwnd;
GetWindowText( hookWnd, capt, 512);
wsprintf(temp, "FocusWnd = %d, WndCaption = %s", hookWnd, capt);
strcpy(toSendText, temp); break; default:
break;
}
} return CallNextHookEx(glhCallWndHook,nCode,wParam,lParam);}
解决方案 »
- NSIS怎么用啊?
- 记录集是只读
- 请问怎样在代码中把如“D:\bmp\123.bmp”这样的图片加载入CBitmap对象中去?(新手上路)
- 如何调入一张 JPG/GIF 图片,然后缩小,然后再保存为另一张图片?谢谢!希望能有代码!!
- 求判断一任意多边形区域和圆弧或饼图相交的算法???
- ====我想将powerpoint上的内容打印下来====
- 请教最大化问题和ListBox加入字符串问题!
- 做过把文档中的信息写道Word 2000中的朋友,帮个忙
- outlook中的组合框的文本失去焦点后消失
- MFC SQL Update问题
- 问个最最简单的问题,如何得到程序的名称呀
- 请问有没有主要开发界面或者作界面简单的软件
// 检查WSAStartup的返回值.
WSAStartup(MAKEWORD(2, 0), &data);unsigned short port = 9876;
struct sockaddr_in dstAddr;
memset(&dstAddr, 0, sizeof(dstAddr));dstAddr.sin_port = htons(port);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
// 检查dstSocket的返回值,SDK并不保证每次创建SOCKET都成功.
dstSocket = socket(AF_INET, SOCK_STREAM, 0);
// 检查connect的返回值,并非每次连接服务器都是成功的,
// 如果失败使用WSAGetLastError获取原因并告诉用户.
connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr));
// 检查发送是否成功.同上.
// strlen(toSendText)+1?toSendText足够大么?
send(dstSocket, toSendText, strlen(toSendText)+1, 0);//此处发生错误,但是不知道为什么??
不过我也觉得,可能toSendText足够大么,但是如何保证toSendText足够大呢?
再次求教!!
同一个地址空间中的其他D L L可能尚未执行它们的D l l M a i n函数。这意味着它们尚未初始
化,因此你应该避免调用从其他D L L中输入的函数。此外,你应该避免从D l l M a i n内部调
用L o a d L i b r a r y ( E x )和F r e e L i b r a r y函数,因为这些函数会形式一个依赖性循环。
Platform SDK文档说,你的D l l M a i n函数只应该进行一些简单的初始化,比如设置
本地存储器(第2 1章介绍),创建内核对象和打开文件等。你还必须避免调用U s e r、
S h e l l、O D B C、C O M、R P C和套接字函数(即调用这些函数的函数),因为它们的
D L L也许尚未初始化,或者这些函数可能在内部调用L o a d L i b r a r y ( E x )函数,这同样会
形成一个依赖性循环。
另外,如果创建全局性的或静态的C + +对象,那么应该注意可能存在同样的问题,
因为在你调用D l l M a i n函数的同时,这些对象的构造函数和析构函数也会被调用。