  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		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 文章: 4252 來自: Taipei,Taiwan
  第 3 樓
  | 
		
			
				 發表於: 星期三 十一月 01, 2006 9:49 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				help 剪貼時間:   
 
 
--------------------------------------------------------------------------
 
存取動態連結函數庫
 
如果需要呼叫的函數在某 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. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		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) | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |