??xml version="1.0" encoding="utf-8" standalone="yes"?>
在这里介l下W三U方式,也就是如何让一个exeE序加蝲多个DLL资源Qƈ在这些DLL中找相应的资源的问题Q?br> m_hResDll = ::LoadLibrary(_T("rc1.dll"));
m_hResDll2 = ::LoadLibrary(_T("rc2.dll"));
m_pExeModule = new CDynLinkLibrary(AfxGetInstanceHandle(), AfxGetResourceHandle());
AfxSetResourceHandle(m_hResDll);
m_pExeModule2 = new CDynLinkLibrary(AfxGetInstanceHandle(), AfxGetResourceHandle());
AfxSetResourceHandle(m_hResDll2);
在这里值得注意的是Q要调用
m_pExeModule = new CDynLinkLibrary(AfxGetInstanceHandle(), AfxGetResourceHandle());
q个语句Q如果没有这个语句,那么q个E序的原有资源模块将视ؓ(f)释放。也׃?x)到原有的资源模块中L索?br>
在这个开发的q程中,我自认ؓ(f)Ҏ(gu)个过E是清晰的,明了(jin)的。但是在开发的q程中却因一个细节问题而迫使我׃(jin)整整一个上午的旉来调试,最后得以发现这个问题。这里我q单地回顾q个开发过E?/span>
1Q利用向g?/span>MFC Regular DLL 框架?/span>
2Q在app文g中加入一个导出的哑函敎ͼ是什么事也不做的函数Q来让这?/span>DLL支持隐式的加?/span>.
?/span> extern “C” __declspec(dllimport) DummyExport() {}
3: d一个自CWndz的类Q就?/span>MyCWnd好了(jin)?/span>
4Qؓ(f)q个MyApp映射消息。如映射一?/span>OnLButtonDown。ƈ在这个消息中向父控g?br> ?gu)q消息Q当然实际项目中可不?x)是q样单,q里只是让控件的框架
先能跑v来证明与外界的消息是畅通的Q?/span>
GetParent()->SendMessage(WM_COMMAND, GetCtrlID(), GetSafeHwnd());
5: 自定义一个消?/span> #define WM_MYWNDLAUGH (WM_USER + 106)q完成相应的映射?/span>
6Qؓ(f)?jin)注册这自己的这个窗体类别,我们必须有一个静(rn)态的注册函数Q?br> 以便?/span>CWinApp::InitInstance时注册窗体类?/span>
q里是关键?br>
8: 在用者界面中d自定义控Ӟ控g的类别就是上面的wc.lpszClassName对应的名U?/span>
9: 在用者类中映子控g消息
10:在早期就调用上述的哑函数?/span>
11:向自定义控g发送消息。这样就搭v?jin)一个自定义控g的框Ӟ在上面的q些步聚中就?br> W6步要l心(j)。余下的是加特性的工作?jin)。上q参考了(jin)MFC技术内q等有关资料?/span>
每当q入d敎ͼ我就对这个计数器q行递增一ơ,每次d前我减一。我要的时候我在E序中直接取q个计数器就行了(jin)。这h很好地达C(jin)我的目标。当然把q个数据D|在某个共享的DLL中的也是可以的,q个Z么能够实现还得从PE文g来说。在q里我只要知道这些宏?x)在生成PE文g时会(x)q把q个D|到共享段中去Q这样windows在加载多个时q不?x)对q个数据D进行多份复制就行了(jin)?br>
//////////////////////////////////////////////////////////////////////////
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
//////////////////////////////////////////////////////////////////////////
int main()
{
WSADATA wsaData;
SOCKET listenSocket = INVALID_SOCKET;
SOCKET clientSocket = INVALID_SOCKET;
char recvBuf[DEFAULT_BUFLEN];
int iResult,iSendResult;
int recvBuflen = DEFAULT_BUFLEN;
iResult = WSAStartup(MAKEWORD(2,0),&wsaData);
if(iResult)
{
printf("WSASTATUP failed!\n");
return 1;
}
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listenSocket == INVALID_SOCKET)
{
printf("socket failed:%ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
sockaddr_in saServer;
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr("127.0.0.1");
saServer.sin_port = htons(5150);
iResult = bind(listenSocket,(sockaddr *)&saServer, sizeof(saServer));
if(iResult == SOCKET_ERROR)
{
printf("bind failed!");
closesocket(listenSocket);
WSACleanup();
return 1;
}
iResult = listen(listenSocket, SOMAXCONN);
if(iResult == SOCKET_ERROR)
{
printf("LISTEN failed!");
closesocket(listenSocket);
WSACleanup();
return 1;
}
printf("Wait client connect");
clientSocket = accept(listenSocket, NULL, NULL);
if(clientSocket == INVALID_SOCKET)
{
printf("accept failed!");
closesocket(listenSocket);
WSACleanup();
return 1;
}
closesocket(listenSocket);
printf("Now wait the data arrive...\n");
do
{
iResult = recv(clientSocket, recvBuf, recvBuflen, 0);
if(iResult > 0)
{
printf("Bytes received:%d\n",iResult);
iSendResult = send(clientSocket, recvBuf, iResult, 0);
if(iSendResult == SOCKET_ERROR)
{
printf("send failed");
closesocket(clientSocket);
WSACleanup();
return 1;
}
else if (iResult == 0)
{
printf("Connect closed!");
}
else
{
printf("recv failed");
closesocket(clientSocket);
WSACleanup();
return 1;
}
}
} while(iResult > 0);
iResult = shutdown(clientSocket, SD_SEND);
if(iResult == SOCKET_ERROR)
{
printf("shut dowm failed!");
closesocket(clientSocket);
WSACleanup();
return 1;
}
closesocket(clientSocket);
WSACleanup();
getchar();
return 0;
}
//客户?br>#include <stdlib.h>
#include <stdio.h>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <windows.h>
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
//////////////////////////////////////////////////////////////////////////
int main()
{
WSADATA wsaData;
SOCKET connectSocket = INVALID_SOCKET;
char *sendBuf = "This is a test";
char recvBuf[DEFAULT_BUFLEN];
int iResult;
int recvBufLen = DEFAULT_BUFLEN;
// if(argc != 2)
// {
// printf("useage:%s server -name\n",argv[0]);
// return 1;
// }
iResult = WSAStartup(MAKEWORD(2,0),&wsaData);
if(iResult)
{
printf("WSASTATUP FAILED.");
return 1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(5150);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
connectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(connectSocket == INVALID_SOCKET)
{
printf("Error at socket!");
WSACleanup();
return 1;
}
iResult = connect(connectSocket, (sockaddr *)&addr, sizeof(addr));
if(iResult == SOCKET_ERROR)
{
printf("Connect failed!");
WSACleanup();
return 1;
}
iResult = send(connectSocket, sendBuf, (int)strlen(sendBuf), 0);
if(iResult == SOCKET_ERROR)
{
printf("Send failed");
closesocket(connectSocket);
WSACleanup();
return 1;
}
printf("Bytes send.");
iResult = shutdown(connectSocket, SD_SEND);
if(iResult == SOCKET_ERROR)
{
printf("shut down failed");
closesocket(connectSocket);
WSACleanup();
return 1;
}
do
{
iResult = recv(connectSocket, recvBuf, recvBufLen, 0);
if(iResult > 0)
{
printf("Bytes received:%d\n",iResult);
}
else if(iResult == 0)
{
printf("connect closed");
}
else
{
printf("Recv failed");
}
} while(iResult > 0);
closesocket(connectSocket);
WSACleanup();
return 0;
}
注意要加入链接库WS2_32.lib
上面的示例代码就q么,当然使用h不会(x)象文章中q样单,但是关键的也是q些?jin)。对创徏q程是q么单?br> 我很喜欢玩两个h比武的游戏,在其中我取得?jin)很多的乐趣Q给开游戏厅的老板了(jin)wؓ(f)热血年的一份心(j)Q也为国家多一份税收。我玩的角色武功套\也就只有q么几招Q招式是单了(jin)些,但很有用Q不是吗Q我l常两个铜牌可以玩上一两个时时辰?br>
?/span>↑ ?/span>
qA ← d
↓ ↑ ↑↓