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);}

解决方案 »

  1.   

    以下是你代码中的错误:
    // 检查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);//此处发生错误,但是不知道为什么??
      

  2.   

    dstSocket的返回值,connect的返回值,都已经检查,都是没有问题的。
    不过我也觉得,可能toSendText足够大么,但是如何保证toSendText足够大呢?
    再次求教!!
      

  3.   

    必须记住,D L L使用D l l M a i n函数来对它们进行初始化。当你的D l l M a i n函数执行时,
    同一个地址空间中的其他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函数的同时,这些对象的构造函数和析构函数也会被调用。
      

  4.   

    To 0delphi(睡个舒服觉多谢指导,受益匪浅!
      

  5.   

    如果需要在dll中进行CSocket的编程,是否有比较好的解决方案?