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

請幫忙 VB 的 DLL 如何在 VFP 中用

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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
文章: 3830
來自: 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. 想學習系統規劃,想找系統架構的顧問

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



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

第 3 樓

發表發表於: 星期一 七月 12, 2010 9:51 am    文章主題: 引言回覆

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

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



註冊時間: 2007-06-21
文章: 766


第 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 是否有在元件內???
回頂端
檢視會員個人資料 發送私人訊息 MSN Messenger
elleryq



註冊時間: 2007-06-21
文章: 766


第 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執行"
這樣就可以正常註冊
回頂端
檢視會員個人資料 發送私人訊息 MSN Messenger
syntech



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

第 13 樓

發表發表於: 星期五 七月 16, 2010 4:20 pm    文章主題: 引言回覆

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

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



註冊時間: 2010-08-26
文章: 247


第 14 樓

發表發表於: 星期二 三月 06, 2018 7:08 am    文章主題: 引言回覆

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

在 Visual FoxPro 中,只能使用專為三十二位元環境撰寫的 DLL......


syntech說得很詳細, 請問能有方法得知一個DLL的函數名稱, 參數數目和型態以及傳回值型態?
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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