dll & codeguard |
尚未結案
|
jason_cyl329
高階會員 ![]() ![]() ![]() ![]() 發表:123 回覆:155 積分:105 註冊:2003-05-26 發送簡訊給我 |
請問,我在打開 Codeguard時發現,呼叫dll後,再將程式關閉會出現以下圖形的系統錯誤,就算是在簡單的dll (顯示一個form而已再關閉)也會,請教前輩我是有用做的地方?
程式碼部分
AnsiString AppDir;
AppDir = CompilePath + "\\TestDll.dll";
if (access(AppDir.c_str(),0) == 0)
dd = LoadLibrary(AppDir.c_str());
else
{
ShowMessage(MsgList->Strings[452]);//"找不到相關的 dll 檔案!!");
return;
}
if (dd)
{
(FARPROC&)Test = GetProcAddress(dd,"CreateHSC_PID");
(FARPROC&)DelTest = GetProcAddress(dd,"DestroyHSC_PID");
Test(MachineType);
DelTest();
}
// FreeLibrary(dd); 錯誤圖形:
|
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
jason_cyl329
高階會員 ![]() ![]() ![]() ![]() 發表:123 回覆:155 積分:105 註冊:2003-05-26 發送簡訊給我 |
|
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
引言: pwipwi你好,我確定有釋放,如果你是用6.0的,可以幫我試試嗎? dll內的程式很簡單, Form2 = new TForm2(NULL); Form2->ShowModal(); delete Form2; 就只有這幾列程式而已!! 謝謝指教!!以上的Code是沒有問題的。leak的地方可能是在ShowModal時所執行的碼,而且TForm的大小至少不止48,和報告中的不合。 另外報告中已經告訴你leak的記憶體是在0x02639422這個地方配置的,用記憶體解讀的相關程式,可以查出是在那個dll或bpl,也可以查出是在那個函式中。不然直接點報告中的位置,也會顯示組合語言的source code。應該就可以看出是那裡出了問題。 |
jason_cyl329
高階會員 ![]() ![]() ![]() ![]() 發表:123 回覆:155 積分:105 註冊:2003-05-26 發送簡訊給我 |
|
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
我測式的結果是沒有問題的,測試碼如下。你可以比照一下。Form3只有一個Button。
//------------------------Dll //Unit1.h extern "C" { __declspec(dllexport) void MakeForm(void); } //Unit1.cpp void MakeForm(void) { TForm3* form = new TForm3(0); form->ShowModal(); delete form; } #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //--------------------------------------------------------------------------- //------------------------主程式 TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- typedef void (*MakeForm)(void); void __fastcall TForm1::Button1Click(TObject *Sender) { HINSTANCE dll; MakeForm makeForm; dll=LoadLibrary("Project1.dll"); if(dll!=NULL) { makeForm=(MakeForm)GetProcAddress(dll, "_MakeForm"); if(makeForm!=NULL) { makeForm(); } else { ShowMessage("Error GetProcAddress"); } FreeLibrary(dll); } else { ShowMessage("Error LoadLibrary"); } } |
jason_cyl329
高階會員 ![]() ![]() ![]() ![]() 發表:123 回覆:155 積分:105 註冊:2003-05-26 發送簡訊給我 |
請問你是用6.0版的嗎,codeguard是否有開啟,
dll部分,在 makeform前面的參數沒有加__stdcall應該是不能呼叫到才對, //------------------------Dll
//Unit1.h
extern "C"
{
__declspec(dllexport) void MakeForm(void);
}
//Unit1.cpp
void MakeForm(void)
{
TForm3* form = new TForm3(0);
form->ShowModal();
delete form;
}
|
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
|
jason_cyl329
高階會員 ![]() ![]() ![]() ![]() 發表:123 回覆:155 積分:105 註冊:2003-05-26 發送簡訊給我 |
|
pwipwi
版主 ![]() ![]() ![]() ![]() ![]() 發表:68 回覆:629 積分:349 註冊:2004-04-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |