VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

VFP使用DLL是否有什麼限制?

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
selina



註冊時間: 2003-10-29
文章: 3


第 1 樓

發表發表於: 星期二 十月 31, 2006 4:52 pm    文章主題: VFP使用DLL是否有什麼限制? 引言回覆

請教各位先進:

在VFP中使用DLL元件有沒有什麼樣的限制,因為現在遇到一個問題,
就是某人提供了VC撰寫的DLL元件,但是我在引用時,它好像都不會傳值
返回到VFP耶(而且沒有任何錯誤訊息),可是若用VB去引用這個元件,它
會正確傳值~~我不曉得問題出在哪,麻煩知道的人可以指教一下,謝謝~~
回頂端
檢視會員個人資料 發送私人訊息
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2160


第 2 樓

發表發表於: 星期二 十月 31, 2006 8:42 pm    文章主題: 引言回覆

有VFP専用的 FLL
請搜尋 FLL 就知道了.

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
syntech



註冊時間: 2003-05-16
文章: 4249
來自: Taipei,Taiwan

第 3 樓

發表發表於: 星期三 十一月 01, 2006 9:49 am    文章主題: 引言回覆

help 剪貼時間: Very Happy

--------------------------------------------------------------------------
存取動態連結函數庫
如果需要呼叫的函數在某 DLL 中,可以連結該函數庫,再呼叫那個函數。於呼叫一個 DLL 函數之前,必須瞭解該函數的呼叫通訊協定,包括函數的名稱,參數的數目和型態以及傳回值型態。

在 Visual FoxPro 中,只能使用專為三十二位元環境撰寫的 DLL。但是,如果需要存取一個十六位元的 DLL,可以使用 Foxtools.fll 中合適的函數來製作。有關的詳細內容,請參閱[說明]中的 Foxtools (Foxtools.chm) 主題。

如何呼叫一個 DLL 函數

使用 DECLARE DLL 命令登記註冊 DLL 函數,函數的名稱大/小寫需符合。
注意 如果指定 WIN32API 為函數庫名稱,Visual FoxPro 將在 Kernel32.dll、Gdi32.dll、User32.dll、Mpr.dll 和 Advapi32.dll 中尋找被呼叫的 32 位元 Windows DLL 函數。

像呼叫其它 Visual FoxPro 函數一樣呼叫 DLL 函數。
例如,下面的程式將登記註冊 Windows USER 系統中 DLL 函數裡的 GetActiveWindow( ) 函數,該函數將顯示 Visual FoxPro 桌面視窗的控制碼。GetActiveWindow( ) 無參數,但傳回一個位元的整數值:

DECLARE INTEGER GetActiveWindow IN win32api
MESSAGEBOX(STR( GetActiveWindow() ) )

包含所要登記註冊函數的 DLL 必須存放在預設目錄、 Windows 或 System 目錄裡,或者在 DOS 路徑中。

如果要呼叫的函數和 Visual FoxPro 中已存在的函數(內部函數或者前面宣告的 DLL 函數)同名稱,您可以儲存重覆的名字,再為該函數取一個別名,然後用別名來呼叫它。

DECLARE INTEGER GetActiveWindow IN win32api AS GetWinHndl
MESSAGEBOX(STR( GetWinHndl() ) )

在結束 Visual FoxPro 之前,所連結的 DLL 函數一直保持有效,因此,在每個資料表格作業中只須宣告一次。如果不想再呼叫 DLL 中的函數,可以執行 CLEAR DLLS 命令將其從記憶體中釋放以節省資源。

附註 執行 CLEAR DLLS 命令時,將從記憶體中釋放所有已宣告的 DLL 函數。

向一個 DLL 傳遞參數
在登記註冊一個 DLL 函數時,必須指定參數的數目和型態。預設情況下,資料依值來傳遞。也可以在參數前面使用符號 (@) 來強制參數依傳址方式傳遞。

一般,DLL 函數遵循 C 語言中的資料型態規則,這和 Visual FoxPro 中的規定有所區別。例如,DLL 函數不支援日期和貨幣資料型態。如果傳遞給 DLL 函數的資料不被該函數支援,那麼在傳遞該資料之前,必須將其轉換成適當的資料型態。例如,如下敘述可以將日期型態轉換成數值型態的 Julian 格式:

cDate = sys(11, date())
nDate = val( cDate )

某些 DLL 函數需要更複雜的參數,如結構或陣列。如果函數需要一個指向結構的指標,那麼必須確定該結構的內部格式,然後在向 DLL 函數傳遞之前或從 DLL 函數傳回之後,轉換成 Visual FoxPro 中的字串。例如,Windows 系統函數 GetSystemTime( ) 需要一個指向結構的指標,該結構包含八個字組或 16 位元無符號整數,分別代表年、月、日等,其結構定義如下:

typedef struct _SYSTEMTIME {
WORD wYear ;
WORD wMonth ;
WORD wDayOfWeek ;
WORD wDay ;
WORD wHour ;
WORD wMinute ;
WORD wSecond ;
WORD wMilliseconds ;
} SYSTEMTIME

為了在 Visual FoxPro 和 GetSystemTime( ) 函數之間傳遞資料,首先必須建立一個 40 個位元組的字串緩衝區(起始時其內容為空白),然後把這個字串的位址作為參數傳遞給函數,讓函數於這個字串填寫要傳回的資料。傳回之後,必須以兩個字元為一單位分析該字串,然後抓取出結構的各個部份。下面的敘述描述了如何抓取該結構的三個欄位:

DECLARE INTEGER GetSystemTime IN win32api STRING @
cBuff=SPACE(40)
=GetSystemTime(@cBuff)

tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) * ;
256 + ASC(SUBSTR(cBuff,1))))
tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) * ;
256 + ASC(SUBSTR(cBuff,3))))
tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6)) * ;
256 + ASC(SUBSTR(cBuff,5))))

如果要獲得更多的訊息,請執行 Visual Studio ...\Samples\Vfp98\Solution\Winapi 目錄中的範例表單 Systime.scx。關於如何向 DLL 函數傳遞參數的其他範例,請參閱 Visual Studio ...\Samples\Vfp98\Classes 目錄中的程式 Registry.prg。

如果在 Visual FoxPro 中使用的資料是陣列,則在傳遞給 DLL 函數之前,必須迴圈該陣列,把它連結為一個符合 C 語言要求的單維字串。如果 Windows 函數需要 16 位元或 32 位元的值,則在連結為字串之前,必須將該值轉換成相同的十六進位的型式。在傳遞包含陣列資料的字串時, Visual FoxPro 將該字串的位址傳輸給 DLL,該 DLL 將其作為陣列處理。範例程式請參閱 Visual Studio ...\Samples\Vfp98\Solution\Winapi 目錄中的範例表單 Syscolor.scx。

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
selina



註冊時間: 2003-10-29
文章: 3


第 4 樓

發表發表於: 星期三 十一月 01, 2006 11:18 am    文章主題: 引言回覆

謝謝各位先進指教,
但老實說..不太懂意思耶...
我直接PO我引用元件的程式碼,麻煩各位先進指教
service=createobject("XXX.XXX")
service.queryterminal(aa,bb,cc,dd,ee)

dd -->是這個元件的傳回值,但是不管我給他的初值是什麼,它顯示的都是初值,表示元件並未傳值給我~~麻煩各位先進指正,謝謝!!
回頂端
檢視會員個人資料 發送私人訊息
zxs4785



註冊時間: 2006-11-13
文章: 1


第 5 樓

發表發表於: 星期一 十一月 13, 2006 3:09 pm    文章主題: 引言回覆

试试这样:
service=createobject("XXX.XXX")
service.queryterminal(aa,bb,cc,dd @,ee)
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作