上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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 文章: 4225 來自: 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 文章: 4225 來自: 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 文章: 4225 來自: 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 文章: 451
第 15 樓
|
發表於: 星期日 一月 24, 2021 9:59 pm 文章主題: |
|
|
https://zhtwnet.com/dll-export-viewer/
使用dll viewer 可看!
但猜不到傳入參數,及回傳值,需一個一個try
|
|
回頂端 |
|
|
|