udp dll編程中遇到一個問題

今天在改一個win32的程序,其中調用了CSOCKET,按以下方法改動項目

1、工程設置中,將MFC的使用由原來的“使用標準windows庫”改爲“在共享DLL中使用MFC

如果是英文版,相關選項是:

Microsoft Foundation Classes: Use MFC in a shared dll, no using MFC

2、頭文件包含

不同的MFC類需包含的頭文件是不一樣的。

常用的類,如Cstring, Cedit 等,包含afxwin.h就可以了

如果不清楚包含什麼頭文件的話,可以同msdn進行查詢,msdn中,對於MFC類的介紹中,都會給出相應的header file requirement.

3、#include 語句一定要寫在首行

這一點很重要,通常出現前面講到的windows.h重複包含錯誤,都是因爲#include 語句沒有寫在首行。

另外還要注意的是,如果#include語句是在一個頭文件裏,那麼對應頭文件的包含也要寫在首行。示例如下:

=============

test.h文件的內容如下:

#include <afxwin.h> //保證該語句在首行

test.cpp的文件內容如下:

#include “test.h” //同樣也要保證該語句在首行

=============

如果要用cstring

就包含include <afxwin.h>

並且要保證這個包含處於首行


應爲要用CSOCKET 所以加入了

if(!AfxSocketInit(NULL))
 {
  //AfxMessageBox("Could not initialize Windows Sockets!");
  return FALSE;
 }

然而報afxwin.inl 21行錯誤

<!--StartFragment-->是總在trans->Create()處報錯,說ASSERT錯誤:
調試指在下面:
_AFXWIN_INLINE HINSTANCE AFXAPI AfxGetInstanceHandle()
{ ASSERT(afxCurrentInstanceHandle != NULL);

 

因爲CSocket用到一個窗體(WSAAsyncSelect),而該窗體用的是主線程的消息循環,且該窗體沒有父窗體和子窗體。   
  而創建一個窗體需要一個HINSTANCE還有一個消息循環,在dll中應該用的是Dllmain的HINSTANCE,然後再創建一個線程作爲消息循環,而CSocket用的卻是WinMain的HINSTANCE,和主消息循環。   
    
  由於HINSTANCE的錯誤,CSocket的Create在運行到CWnd::CreateEx是出錯。

所再加入以下行

if(!AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0))
 {
  return FALSE;
 }

發佈了82 篇原創文章 · 獲贊 22 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章