| 上一篇主題 :: 下一篇主題   | 
	
	
	
		| 發表人 | 
		內容 | 
	
	
		cool
 
 
  註冊時間: 2003-05-17 文章: 47
 
  第 1 樓
  | 
		
			
				 發表於: 星期日 七月 11, 2010 1:31 am    文章主題: 請幫忙 VB 的 DLL 如何在 VFP 中用 | 
				     | 
			 
			
				
  | 
			 
			
				請教各先進, 請問
 
已經 REGSVR32 snscomserver.dll
 
 
以下的 vb(中華電信) 如何改為 vfp 呢
 
 
Dim testCom As New SNSCOMSERVERLib.SnsComObject
 
Dim retCode_1 As Long
 
 
retCode_1=testCom.Login(snsip, snsport, snsacc, snspass)
 
If retCode_1=0 Then
 
   MsgBox "成功"
 
   testCom.Logout
 
Else
 
   MsgBox "失敗"
 
End If
 
 
請不吝賜教, 萬分感謝 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 2 樓
  | 
		
			
				 發表於: 星期一 七月 12, 2010 9:50 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				存取動態連結函數庫
 
如果需要呼叫的函數在某 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. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 3 樓
  | 
		
			
				 發表於: 星期一 七月 12, 2010 9:51 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				不過也不一定會成功               XD _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		elleryq
 
  
  註冊時間: 2007-06-21 文章: 768
 
  第 4 樓
  | 
		
			
				 發表於: 星期一 七月 12, 2010 2:11 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				簡單的說
 
 
Dim testCom As New SNSCOMSERVERLib.SnsComObject
 
改成 testCom = CreateObject("SNSCOMSERVERLib.SnsComObject")
 
 
dim 改成 local 或 private 或 public
 
 
msgbox 改成 MessageBox
 
 
後面其實就沒什麼差別了
 
 
你的問題應該在於不熟悉 VB 的用法 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		cool
 
 
  註冊時間: 2003-05-17 文章: 47
 
  第 5 樓
  | 
		
			
				 發表於: 星期一 七月 12, 2010 6:53 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				syntech 先進您好, 謝謝您的回答
 
 
我在命令窗測試如下
 
DECLARE string Login in 'snscomserver.dll' string, string, string, string
 
? login('203.66.172.133','8001','*****','*****')
 
 
卻出現 Cannot find point Login in the DLL 的訊息
 
搜尋文章得知可能跟大小寫有關
 
試著改為 login 及 LOGIN 也是一樣
 
 
請問還有什麼其他要注意的事項嗎?
 
謝謝! | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		cool
 
 
  註冊時間: 2003-05-17 文章: 47
 
  第 6 樓
  | 
		
			
				 發表於: 星期一 七月 12, 2010 6:58 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				elleryq 先進您好, 謝謝您的回答
 
 
我對 VB 的語法是不熟
 
 
我在命令窗測試
 
testCom = CreateObject("SNSCOMSERVERLib.SnsComObject")
 
出現 Class definition SNSCOMSERVERLib.SnsComObject is not found 的訊息
 
我忽略了什麼嗎?
 
煩請指教, 謝謝 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		LiuRambo
 
 
  註冊時間: 2007-11-27 文章: 481
 
  第 7 樓
  | 
		
			
				 發表於: 星期二 七月 13, 2010 6:40 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				註冊是否成功???
 
SnsComObject 是否有在元件內??? | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		elleryq
 
  
  註冊時間: 2007-06-21 文章: 768
 
  第 8 樓
  | 
		
			
				 發表於: 星期二 七月 13, 2010 9:02 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				1. 同意 LiuRambo,用 regsvr32 註冊時,是否有註冊成功呢?
 
2. 如果註冊成功,開啟 regedit,去找尋 SnsComObject,找到以後,看她的鍵值是什麼?
 
3. vb 的 code 是可以執行的嗎?或者只是對方工程師提供給你的?? | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		richshih
 
 
  註冊時間: 2007-10-11 文章: 153
 
  第 9 樓
  | 
		
			
				 發表於: 星期二 七月 13, 2010 12:04 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | cool 寫到: | 	 		  elleryq 先進您好, 謝謝您的回答
 
 
我對 VB 的語法是不熟
 
 
我在命令窗測試
 
testCom = CreateObject("SNSCOMSERVERLib.SnsComObject")
 
出現 Class definition SNSCOMSERVERLib.SnsComObject is not found 的訊息
 
我忽略了什麼嗎?
 
煩請指教, 謝謝 | 	  
 
你需注意路徑的問題  註冊的路徑須與啟用的一樣 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		cool
 
 
  註冊時間: 2003-05-17 文章: 47
 
  第 10 樓
  | 
		
			
				 發表於: 星期五 七月 16, 2010 11:56 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				謝謝各位先進的幫助
 
去查了註冊碼才發現註冊的元件是 SNSCOMSERVER.SnsComObject
 
但廠商提供的VB的內容卻是 SNSCOMSERVERLib.SnsComObject
 
而且該VB執行是正常的(有Lib三個字)
 
不知是何原因
 
所以 用 testcom=CREATEOBJECT('SNSCOMSERVER.SnsComObject')
 
則問題就解決了 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		cool
 
 
  註冊時間: 2003-05-17 文章: 47
 
  第 11 樓
  | 
		
			
				 發表於: 星期五 七月 16, 2010 11:57 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				另請問我 XP 中註冊 SNSCOMSERVER.DLL 是正常的
 
但無法在 WIN7 註冊該 DLL
 
出現的訊息是
 
模組'SNSCOMSERVER.DLL'己經載入, 但是呼叫
 
'dllRegisterServer'失敗,錯誤代碼 0x80020009
 
 
是 WIN7 的問題嗎?
 
WIN7 的註冊方式不是 REGSVR32 SNSCOMSERVER.DLL 嗎?
 
請不吝賜教, 謝謝! | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		LiuRambo
 
 
  註冊時間: 2007-11-27 文章: 481
 
  第 12 樓
  | 
		
			
				 發表於: 星期五 七月 16, 2010 2:51 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				WIN7故意鎖住權限
 
請把"REGSVR32 SNSCOMSERVER.DLL"文字存成BAT或是CMD檔
 
再把檔案上按滑鼠右鍵"以管理者XXXX執行"
 
這樣就可以正常註冊 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		syntech
 
 
  註冊時間: 2003-05-16 文章: 4252 來自: Taipei,Taiwan
  第 13 樓
  | 
		
			
				 發表於: 星期五 七月 16, 2010 4:20 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				uac 關掉............ _________________ 如果公司有下列困擾:
 
1. 找不到便宜,快速,簡易的 生產排程軟體
 
2. 不知道如何快速排定 採購計劃
 
3. 成本抓不準,自己算比軟體算有用
 
4. 想學習系統規劃,想找系統架構的顧問
 
 
請聯絡我們,也許我們幫得上忙 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		kalok
 
 
  註冊時間: 2010-08-26 文章: 284
 
  第 14 樓
  | 
		
			
				 發表於: 星期二 三月 06, 2018 7:08 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | syntech 寫到: | 	 		  存取動態連結函數庫
 
如果需要呼叫的函數在某 DLL 中,可以連結該函數庫,再呼叫那個函數。於呼叫一個 DLL 函數之前,必須瞭解該函數的呼叫通訊協定,包括函數的名稱,參數的數目和型態以及傳回值型態。
 
 
在 Visual FoxPro 中,只能使用專為三十二位元環境撰寫的 DLL...... | 	  
 
 
syntech說得很詳細, 請問能有方法得知一個DLL的函數名稱, 參數數目和型態以及傳回值型態? | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		CPS0204
 
 
  註冊時間: 2014-08-24 文章: 482
 
  第 15 樓
  | 
		
			
				 發表於: 星期日 一月 24, 2021 9:59 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				https://zhtwnet.com/dll-export-viewer/
 
 
使用dll viewer 可看!
 
但猜不到傳入參數,及回傳值,需一個一個try
 
 | 
			 
		  | 
	
	
		| 回頂端 | 
		 | 
	
	
		  | 
	
	
		 |