線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:934
推到 Plurk!
推到 Facebook!

如何在dll中寫一個class來export

尚未結案
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-30 18:19:14 IP:220.130.xxx.xxx 未訂閱
大家好 當我用呼叫寫好在Dll中的MessageBox,便會出現Access vilation的錯誤訊息 不知道是那邊錯,,,不吝賜教. 我的程式如下  
#DemoMCDll.h
//--------
#define   DemoMCDLL_EXPORTS
//------
#ifdef    DemoMCDLL_EXPORTS
#define   DemoMCDLL_API    __declspec(dllexport)
#else
#define   DemoMCDLL_API    __declspec(dllimport)
#endif
#ifdef    __cplusplus
extern "C" {
#endif
DemoMCDLL_API void beep(WORD wCounter);
#ifdef    __cplusplus
}
#endif
//---------------------------------------------------------------------------
class DemoMCDLL_API CDemoDll
{
     public:
          CDemoDll(char*);
          ~CDemoDll();
          //--------
          void MCMsg(void);
          char *Msg;
};    DemoMCDll.cpp
//-------Dll建立
/--------------------------------------------------------------------    #include 
#include "DemoMCDll.h"
//---------------------------------------------------------------------------
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
     return 1;
}
//---
DemoMCDLL_API void beep(WORD wCounter)
{
}
//---------------------------------------------------------------------------
CDemoDll::CDemoDll(char* msg)
{
     Msg=NULL;
     Msg=new char[255];
     Msg=msg;
}
//------
CDemoDll::~CDemoDll()
{
    if(Msg) delete [] Msg;Msg=NULL;//問題在這
}
//------
void CDemoDll::MCMsg()
{
     MessageBox(NULL,Msg,"Dll",MB_OK);
}
//------
.
.
.
.
.
//主程式
//
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     CDemoDll *MyDll=new CDemoDll("Hello World");
     MyDll->MCMsg();
     delete MyDll;//問題在這
}     
//-------------------- Begin with the end in mind.
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 21:13:28 IP:61.62.xxx.xxx 未訂閱
您可以參考一下這一篇: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=32223
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-30 21:57:58 IP:211.76.xxx.xxx 未訂閱
Fm你好:     你的問題出現在Class的Contructor中:  
 
CDemoDll::CDemoDll(char* msg)
{
     Msg=NULL;
     Msg=new char[255];
     Msg=msg;
}
應該要改成
 
CDemoDll::CDemoDll(char* msg)
{
     Msg=NULL;
     Msg=new char[255];
     strcpy(msg,Msg);
}
另外用到strcpy記得要include string.h
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-01 11:04:59 IP:220.130.xxx.xxx 未訂閱
pwipwi前輩 更改了之後這個問題就ok了...但是怎麼會這樣我還是不懂 方便解釋嗎 ps:好像不能同時回應主題 結案 //-------------------- Begin with the end in mind.
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-01 15:02:05 IP:211.76.xxx.xxx 未訂閱
Fm你好:     這個bug關連不少議題:pointer,string,new,delete。我就我所能的解釋,如果不清楚的地方就請你再提出來吧~ 先由你原來的函式說起: < class="code"> CDemoDll::CDemoDll(char* msg) { Msg=NULL; Msg=new char[255]; Msg=msg; } char* Msg是一個指標。在windows系統下,這個指標實際上是一個4 byte的變數,記錄著一個地址。(你可以把他想像成住家的住址) Msg = new char[255]; 上面的程式碼向系統要了一塊記憶體(想像成房子),並且回傳了地址給Msg。 Msg = msg 上面的程式碼把msg的地址指派給了Msg。 這時你應該可以發現,之前要來的"房子"的_地址_已經不見了,msg和Msg都是記錄著同一個地址。而msg和Msg記錄的地址是指向Button1Click裡面的"Hello World"。 這時bug已經產生,不過還沒真正出問題。直到... delete [] Msg; 這時你還回去的房子是Button1Click裡的"Hello World",而不是之前配給你的房子(地址早就不見了...)。於是bug引爆.... 其實你要做到的功能是:向系統要個房子,並且把房子裝成和"Hello World"一樣。strcpy正是針對字串做這類的事:傳給他兩個地址,他就把兩個地址指向的房子弄成一樣,於是這就解決你的問題。 不知道這麼解說是否清楚?
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-01 16:39:24 IP:220.130.xxx.xxx 未訂閱
pwipwi前輩 這種問題常讓我confuse... < > 這樣子說我瞭解了,,,謝謝囉! < > //-------------------- Begin with the end in mind.
系統時間:2024-07-01 17:02:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!