我編了一個程式功能為:從D盤檔案夾選取txt檔案,并對檔案進行合并和資料提取。
沒有封裝為.dll前程式能正常運行,封裝完以后出現如下錯誤提示:access violation at address xxxxx in module xx.dll,介面程式沒有問題,各位大神能提供一下幫助嗎,求指教,感激不盡
經過我單步除錯發現錯誤彈出的地方在edit1顯示檔案名稱這一條陳述句上,代碼如下:
_fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
int row;
int lines;
const char *importFilePath;
FILE *fp=NULL;
OpenDialog1->InitialDir="D:\\";
OpenDialog1->Filter= "文本檔案(*.txt)|*.txt|所有檔案(*.*)|*.*";
SaveDialog1->InitialDir ="D:\\";
SaveDialog1->Filter= "文本檔案(*.txt)|*.txt|所有檔案(*.*)|*.*";
SaveDialog1->DefaultExt = ".txt" ;
OpenDialog2->InitialDir="D:\\";
OpenDialog2->Filter= "文本檔案(*.txt)|*.txt|所有檔案(*.*)|*.*";
SaveDialog2->FileName ="SwarmUUV";
SaveDialog2->InitialDir ="D:\\";
SaveDialog2->Filter= "文本檔案(*.txt)|*.txt|所有檔案(*.*)|*.*";
SaveDialog2->DefaultExt = ".txt" ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImportFileButtonClick(TObject *Sender)
{
OpenDialog1->Execute();
Form1->Edit1->Text = Form1->OpenDialog1->FileName;
}
uj5u.com熱心網友回復:
錯誤資訊,未封裝前程式正常
uj5u.com熱心網友回復:
就這些代碼來看,應該沒有問題,雖然OpenDialog1->Execute();
Form1->Edit1->Text = Form1->OpenDialog1->FileName;
邏輯上有點問題,應該
if (OpenDialog1->Execute())
Form1->Edit1->Text = Form1->OpenDialog1->FileName;
但是也不會導致例外
uj5u.com熱心網友回復:
Form1改成this呢?uj5u.com熱心網友回復:
你把 工程名.cpp 檔案貼一下看看?uj5u.com熱心網友回復:
非常感謝,已經正常運行了,但原理我不太清楚,能否告知一下,非常感謝uj5u.com熱心網友回復:
多謝各位大神相助,已經解決問題了,將Form1指標改為this即可uj5u.com熱心網友回復:
用this是C++的標準語法,而Form1只是一個全域(外部)變數名,有作用域和有效性問題(比如是否為NULL即未創建)。具體原理說不清楚,如果Form1為NULL是會AV錯誤的。
高版本的編譯器有的好像不支持Form1->Edit1這樣的。
uj5u.com熱心網友回復:
你的dll的輸出介面函式里面,是不是用new來動態創建TForm1表單?這個時候沒Form1啥事了,Form1還是NULL。exe專案里面用Form1正常是因為:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1); //這里創建了Form1表單,不是new創建的
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
uj5u.com熱心網友回復:
實際上在TFrom1的成員函式內部使用Form1是多此一舉Form1->Edit1->Text = Form1->OpenDialog1->FileName;
完全可以
Edit1->Text = OpenDialog1->FileName;
uj5u.com熱心網友回復:
你的dll的輸出介面函式里面,是不是用new來動態創建TForm1表單?這個時候沒Form1啥事了,Form1還是NULL。
exe專案里面用Form1正常是因為:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1); //這里創建了Form1表單,不是new創建的
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
uj5u.com熱心網友回復:
類的成員函式里面訪問成員變數是可以省略this的,你看一下TForm1.h頭檔案就明白了。uj5u.com熱心網友回復:
初出茅廬,跟各位大哥學到了很多,謝謝轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/42662.html
標籤:VCL組件使用和開發
上一篇:有沒有大神幫我看下這個問題
下一篇:怎樣學習c++
