全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1522
推到 Plurk!
推到 Facebook!

採用Dll 方式取得 *.INI內不同 Section 的字串 時有 Privileged instruction 錯誤?請高手指教問題是出在哪??

尚未結案
g9412747
初階會員


發表:3
回覆:28
積分:36
註冊:2009-02-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-12-09 17:16:20 IP:59.120.xxx.xxx 訂閱
說明: 兩個Function , 一個用來讀取INI中所設定的 資料庫FileName ,另一個用來讀取 ADO元件與資料庫連接的 ConnectingString
若不將這兩個Dunction包成Dll檔 , 直接以函數呼叫使用 ,則程式一切執行正常
但是若包在Dll裡 , 透過 Load Dll 後, 再使用GetProcAddress , 則第一次取得的Func1 可以正常(無論是要先讀取 資料庫FileName 還是ConnectingString)
接著再使用 GetProcAddress 取得 Func2 想要來讀取後來的 資料庫FileName 還是ConnectingString , 都會出現 Privileged instruction 錯誤

爬文很久 , 一直被這問題困擾 , 僅管說可採用別種寫法就不會這樣了 , 但還是很執著的想瞭解為什麼會有這種情況???
麻煩各位大大幫幫忙 , 告訴我為什麼會這樣!!

網路上大多的回答我都試過了, 如 , Dll中return改用char , 不要用AnsiString , 測過都會發生Privileged instruction 錯誤


程式碼如下:

[DLL內]


[code cpp]
String Str2;
String Str3;

extern "C" String __declspec(dllexport) __stdcall LoadINIDBName(String initemp)
{
TMemIniFile *iniSpec = new TMemIniFile(ChangeFileExt(AnsiString(INIStr), ".INI" ));
Str2 = iniSpec->ReadString("New Database","FileName",-1);
delete iniSpec;
return Str2;
}

extern "C" String __declspec(dllexport) __stdcall LoadODBCConnect(String initemp)
{
TMemIniFile *iniSpec = new TMemIniFile(ChangeFileExt(AnsiString(INIStr), ".INI" ));
Str3 = iniSpec->ReadString("ConnectStr","ConnectingString",-1);
delete iniSpec;
return Str3;
}
[/code]


[主程式內]

Button1 Click功能內


[code cpp]
String ApName = Application->ExeName; //主程式路徑 (for 取得INI檔)
String ConnectionString; //連接字串
String ODBCConnectStr;
String MDBFileName;
String INIStr1;

{
typedef String (*LOADINIDBNAME)(String);
HINSTANCE hDLL = NULL;
LOADINIDBNAME LoadINI,LoadODBC;

//載入DLL檔
hDLL = LoadLibrary("LoadINIDB.dll");

if(hDLL == NULL)
{
MessageBox(hWnd,"LoadINIDB.dll 檔案載入失敗!","訊息",MB_ICONERROR);
return;
}

LoadINI = (LOADINIDBNAME)GetProcAddress(hDLL,"LoadINIDBName");
MDBFileName = LoadINI(ApName); //取得 MDB 檔名稱(正常取得ini中 資料庫的FileName)(奇怪處:換成Dll內另一個 LoadODBCConnect 函數先做 也會正常)

LoadODBC = (LOADODBCCONNECT)GetProcAddress(hDLL,"LoadODBCConnect");
ODBCConnectStr = LoadODBC(ApName);//取得連接字串 ==>(這一個一定會出現 Privileged instruction 錯誤 , 不管是 LoadINIDBName(..) 或是 LoadODBCConnect()後做 )

FreeLibrary(hDLL);
}
[/code]


請幫忙解決我的疑惑 , 謝謝





系統時間:2024-04-20 14:22:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!