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

使用靜態載入(Implicit Linking)

答題得分者是:taishyang
ReLife
一般會員


發表:8
回覆:7
積分:3
註冊:2004-12-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-11 17:02:17 IP:118.160.xxx.xxx 訂閱
小弟嘗試使用靜態載入的方法,但是編譯無法成功,苦惱
請各位前輩幫忙!!

ShowMsg.cpp
[code cpp]
#include
#pragma hdrstop

#pragma argsused
USEFILE ("ShowMsg.h");

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
int ShowMsg(char* pText,HWND hWnd)
{


return MessageBox(hWnd,pText,"Information",MB_OK);
}
[/code]
ShowMsg.h
[code cpp]
#ifndef ShowMsgH
#define ShowMsgH

#ifdef__DLL__
#define DLLAPI extern "C" __declspec(dllexport)
#else
#define DLLAPI extern "C" __declspec(dllimport)
#endif
DLLAPI int ShowMsg(char* pText,HWND hWnd);

#endif
[/code]


另外..編譯成功後該怎麼載入呢?
感謝!!


附件是整個project所包含的檔案(_ _)
編輯記錄
ReLife 重新編輯於 2008-11-11 17:03:06, 註解 無‧
ReLife 重新編輯於 2008-11-11 17:03:39, 註解 無‧
ReLife 重新編輯於 2008-11-11 17:07:52, 註解 無‧
ReLife 重新編輯於 2008-11-11 17:08:51, 註解 無‧
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-11 18:20:35 IP:118.169.xxx.xxx 訂閱
假如你是用BCB的話
//ShowMsg.h file
#ifndef ShowMsgH
#define ShowMsgH

#ifdef __DLL__
#define DLLAPI extern "C" __declspec(dllexport)
#else
#define DLLAPI extern "C" __declspec(dllimport)
#endif
DLLAPI int ShowMsg(char* pText,HWND hWnd);
#endif

//
ShowMsg.cpp file
#include < windows.h >
#pragma hdrstop
#pragma argsused
#include "ShowMsg.h"
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}

int ShowMsg(char* pText,HWND hWnd)
{
return MessageBox(hWnd,pText,"Information",MB_OK);
}

另外開啟一專案來測試
1. 把lib加到專案中 [Projett]->[Add to project]
2. 測試的code如下

#include "ShowMsg.h"
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMsg("test", NULL);
}
//---------------------------------------------------------------------------



編輯記錄
taishyang 重新編輯於 2008-11-11 18:21:32, 註解 無‧
ReLife
一般會員


發表:8
回覆:7
積分:3
註冊:2004-12-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-13 10:23:49 IP:118.160.xxx.xxx 訂閱
thanks taishyang大大

編譯(CTRL F9)ShowMsg.bpr後將ShowMsg.lib ShowMsg.h放在新的project中還是無法執行哩!!
錯誤訊息如下:這個應用程式無法啟動,因為找不到SHOWMSG.DLL,重新安裝應用程式可能可以解決這個問題

將ShowMsg.dll放進資料夾後是OK..but似乎已經不是靜態載入了(汗)

是不是哪個步湊錯誤了呢?



PS:下面兩個選項都disable掉了
Project->Options->Packages->Runtime packages->Build with runtime packages
Project->Options->Linker->Linking->Use dynamic RTL
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-13 10:30:35 IP:118.169.xxx.xxx 訂閱
以Win32 API LoadLibrary來載入DLL才是動態載入
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-13 11:00:25 IP:220.132.xxx.xxx 未訂閱

http://delphi.ktop.com.tw/download.php?download=upload/491b980d2bb65_Implicit_Linking.rar

不知這麼寫對不對耶!! ,但至少應該可以用吧!!!


===================引 用 ReLife 文 章===================
小弟嘗試使用靜態載入的方法,但是編譯無法成功,苦惱
請各位前輩幫忙!!

ShowMsg.cpp
[code cpp]
#include
#pragma hdrstop

#pragma argsused
USEFILE ("ShowMsg.h");

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
return 1;
}
int ShowMsg(char* pText,HWND hWnd)
{


return MessageBox(hWnd,pText,"Information",MB_OK);
}
[/code]
ShowMsg.h
[code cpp]
#ifndef ShowMsgH
#define ShowMsgH

#ifdef__DLL__
#define DLLAPI extern "C" __declspec(dllexport)
#else
#define DLLAPI extern "C" __declspec(dllimport)
#endif
DLLAPI int ShowMsg(char* pText,HWND hWnd);

#endif
[/code]


另外..編譯成功後該怎麼載入呢?
感謝!!


附件是整個project所包含的檔案(_ _)
ReLife
一般會員


發表:8
回覆:7
積分:3
註冊:2004-12-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-23 21:21:38 IP:123.110.xxx.xxx 訂閱
sor...好多天都沒上論壇
回正題.............


搞混了...>"<
目前ShowMsg.lib ShowMsg.h放在測試程式資料夾底下並且
1. 把lib加到專案中 [Projett]->[Add to project]
2. 測試的code如下
#include "ShowMsg.h"
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ShowMsg("test", NULL);
}
//---------------------------------------------------------------------------

但無法show出預期的結果,反而跑出這樣的訊息___
錯誤訊息如下:這個應用程式無法啟動,因為找不到SHOWMSG.DLL,重新安裝應用程式可能可以解決這個問題


小弟所知的情況是
引用DLL ==> 動態載入
引用*.H *.LIB ==> 靜態載入




===================引 用 taishyang 文 章===================
以Win32 API LoadLibrary來載入DLL才是動態載入
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-24 10:44:32 IP:118.169.xxx.xxx 訂閱
http://www.wretch.cc/blog/fredxxx123/9249665
缺點:
1 、 當這個程式靜態載入方式所使用到的這個DLL不存在時
這個程式在開始時就出現無法找到DLL的訊息而 導致應用程式無執行。
ReLife
一般會員


發表:8
回覆:7
積分:3
註冊:2004-12-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-26 14:32:08 IP:118.160.xxx.xxx 訂閱
原來如此!!   靜態連結還有一個「程式必須找到該DLL」的限制存在

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