[問題] 請教MFC中呼叫DLL return LPTSTR一問

看板C_and_CPP (C/C++)作者 (想重回校園的工程師)時間15年前 (2010/07/28 23:47), 編輯推噓1(1020)
留言21則, 5人參與, 最新討論串1/1
請教各位前輩一些有關DLL的疑惑: 小弟最近因工作上的需要故一直想辦法將自己原本撰寫好的VC++ code 轉為DLL以便給其他案子使用 但是最近寫得頭昏轉向,導致自己觀念模糊掉了 請上來請教各位前輩以下問題: 1.小弟撰寫一個DLL內容包含一個以下的Function LPTSTR CSpiderEntry::GetHtmlContent(LPCTSTR strUrl) { CString strRequest = pSpider->GetHttpContent(strUrl);//爬取網頁 wchar_t *pRequestSTR = new wchar_t[strRequest.GetLength() + 1]; _tcscpy(pRequestSTR,strRequest.GetBuffer(0)); strRequest.ReleaseBuffer(); return pRequestSTR; } 以上是一個準備給外部Dialog所Call的Function主要回傳抓到的HTML code 問題在於,小弟 return 的型態為LPTSTR 故在Function裡面new了一個wchar_t* 並且return他 2.小弟準備了一個Dialog呼叫此Function並且依照以下的方式 LPTSTR strTempW = mSpiderEntry.GetHtmlContent(L"http://www.xxoo.com.tw/"); CString strHtml = strTempW; delete strTempW; OK~以上在Debug Mode方式皆正常,問題出在於Release會出現錯誤 而錯誤居然出現在 delete strTempW 這裡 小弟疑惑的是,當我在Function裡面new出來的指標在Dialog內去Delete是有問題的?? 那我把delete strTempW拿掉則正常Run 但是不就產生內存的問題了嗎?? 以上問題請教各位前輩 小弟的觀念哪裡出錯了 非常謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 115.43.156.107

07/28 23:50, , 1F
windows DLL 裡 new的資料必須要在DLL裡 delete ....
07/28 23:50, 1F

07/29 08:50, , 2F
那請問前輩,那我該如何傳出LPTSTR等字串呢??
07/29 08:50, 2F

07/29 09:01, , 3F
delete[] strTempW
07/29 09:01, 3F

07/29 09:22, , 4F
fi大:若用delete[] strTempW則在ReleaseMode下會掛掉...
07/29 09:22, 4F

07/29 09:22, , 5F
而DebugMode下則正常運作....這.....?!!?
07/29 09:22, 5F

07/29 09:41, , 6F
你上網搜尋 dll new delete查一下吧`
07/29 09:41, 6F

07/29 09:58, , 7F
dll 跟 exe 連結的記憶體分配模組可能會不同, 最好是讓 dll
07/29 09:58, 7F

07/29 09:59, , 8F
來釋放記憶體. 但是陣列應該使用 delete[] 來釋放
07/29 09:59, 8F

07/29 10:48, , 9F
你的dll也是build成release mode嗎?
07/29 10:48, 9F

07/29 13:39, , 10F
是的,ReleaseMode,經由上面前輩提醒,的確,是不同記憶體
07/29 13:39, 10F

07/29 13:40, , 11F
模組產生,所以在EXE去Delete DLL 內的區塊必然發生錯誤
07/29 13:40, 11F

07/29 13:41, , 12F
雖然知道問題了,但是卻不知道怎麼解決,原因是,若我在DLL
07/29 13:41, 12F

07/29 13:42, , 13F
內去delete那怎麼把字串給船出來??,若我乾脆在EXE new好
07/29 13:42, 13F

07/29 13:42, , 14F
再把位址傳給DLL,但卻不知道要new多大,因為不知道字串大
07/29 13:42, 14F

07/29 13:43, , 15F
小,所以很兩難...期盼有經驗的前輩給予指導
07/29 13:43, 15F

07/29 13:44, , 16F
dll裡同時提供取回address與釋放memory的interface啊@@
07/29 13:44, 16F

07/29 13:45, , 17F
另一個策略, dll裡提供GetContent與GetSize兩interface,
07/29 13:45, 17F

07/29 13:46, , 18F
caller必須先GetSize, 再call GetContent; 當然, dll內
07/29 13:46, 18F

07/29 13:47, , 19F
部可以只Get一次同時記錄size與content, 待caller呼叫到
07/29 13:47, 19F

07/29 13:47, , 20F
GetContent走之後, 再看是否把dll內的暫時memory free掉
07/29 13:47, 20F

07/29 13:50, , 21F
非常謝謝V大給予方向,小弟試試看.....^^
07/29 13:50, 21F
文章代碼(AID): #1CK545xo (C_and_CPP)
文章代碼(AID): #1CK545xo (C_and_CPP)