全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2075
推到 Plurk!
推到 Facebook!

COM元件,在VB執行OK但在DELPHI下會出現Property的值超過的異常

缺席
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-04-22 14:28:17 IP:211.22.xxx.xxx 訂閱
COM元件的文件說明如下:
typedef struct DEVICEINFO {
short nPortNumber;
short nCpuNumber;
short nNetWorkNumber;
short nStationNumber;
short nUnitNumber;
BSTR strIPNumber;
long nTimeout;
} DEVICEINFO;
------------------------------------------------------------------------
VB 環境OK
-------------------------------------------------------------------
Private P_objCpRegister As YcsComm.ICpRegister
Private P_DevInfo As YcsComm.DEVICEINFO

Set P_objCpRegister = New YcsComm.CpRegister
P_DevInfo.nPortNumber = 1
P_DevInfo.nCpuNumber = 1
P_DevInfo.nNetWorkNumber = 0
P_DevInfo.nStationNumber = 0
P_DevInfo.nUnitNumber = 1
P_DevInfo.strIPNumber = "192.168.1.1"
P_DevInfo.nTimeout = 5000

P_objCpRegister.SetDeviceInfo P_DevInfo -> 執行此行不會出錯誤
P_objCpRegister.Open
----------------------------------------------------------------------------------------------------
Delphi 下執行會出現異常 => Property 值超過
----------------------------------------------------------------------------------------------------
Type Import Libray時自動轉出的Record 如下:
DEVICEINFO = packed record
nPortNumber: Smallint;
nCpuNumber: Smallint;
nNetWorkNumber: Smallint;
nStationNumber: Smallint;
nUnitNumber: Smallint;
strIPNumber: WideString;
nTimeout: Integer;
end;

程式碼

var
pData: DEVICEINFO;
begin
CpRegister.ACCESSMODE := YCS_BACKGROUND_SERVICE;
//
pData.nPortNumber := 1;
pData.nCpuNumber := 1;
pData.nUnitNumber := 1; // cp-217
pData.nNetWorkNumber := 0;
pData.nStationNumber := 0;
pData.strIPNumber := WideString('192.168.1.1'); 因為其它欄位都是數值就此欄WideString沒用過,懷疑是此欄位的關係 !
pData.nTimeout := 3000;
try
CpRegister.SetDeviceInfo(pData); -> 執行此行會出錯
finally
memo1.Lines.Add('SetDeviceInfo ... ' inttoHex(CpRegister.LastErrorCode, 8));
CpRegister.LastErrorCode := 0;
end;
end;
sryang
尊榮會員


發表:38
回覆:741
積分:875
註冊:2002-06-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-04-22 15:56:33 IP:59.125.xxx.xxx 訂閱
pData.strIPNumber := '192.168.1.1';
這樣就好

===================引 用 bill534 文 章===================
pData.strIPNumber := WideString('192.168.1.1'); 因為其它欄位都是數值就此欄WideString沒用過,懷疑是此欄位的關係 !
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-04-22 16:27:06 IP:211.22.xxx.xxx 訂閱
一樣會出錯!



下列是VC 的範例(從原廠手冊剪下地) :
#import "YcsComm10.dll" no_namespace // タイプライブラリのインポート
DEVICEINFO m_deviceinfo; //DEVICEINFO 構造体定義
ICpRegsiterPtr m_objRegister; //I/F ポインタの定義
…(中略)…
Try
{
// インスタンスの作成
m_objRegister.CreateInstance(__uuidof(CpRegister));
// 通信デバイス情報の各項目を設定する
m_deviceinfo.nPortNumber = 1;
m_deviceinfo.nCpuNumber = 1;
m_deviceinfo.nNetworkNumber = 1;
m_deviceinfo.nStationNumber = 1;
m_deviceinfo.nUnitNumber = 1;
CString strIP = "192.168.1.1"
m_deviceinfo.strIPNumber = strIP.AllocSysString();

m_deviceinfo.nTimeout = 5000;
// 通信デバイス情報を設定する
m_objRegister->SetDeviceInfo(&m_deviceinfo);
}
Catch(_com_error &e)
{
MessageBox(e.Description());
}
…(中略)…
m_objRegister.Release(); // インスタンスの解放
m_objRegister = NULL;
SysFreeString(m_deviceinfo.strIPNumber);
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-26 11:22:04 IP:211.22.xxx.xxx 訂閱
當我用如下方法(紅字)執行時,則會出現"msvcrt.dll的存取異常",
若輸入StrIP:='192.168.1.1'後執行時則一樣出現property值超出範圍值!

var
pData: DEVICEINFO;
StrIp: WideString;
begin
pData.nPortNumber := 1;
pData.nCpuNumber := 1;
pData.nUnitNumber := 1; // cp-217
pData.nNetWorkNumber := 0;
pData.nStationNumber := 0;
StrIP := '';
pData.strIPNumber := StrIP;
pData.nTimeout := 3000;
try
CpRegister.SetDeviceInfo(pData);
CpRegister.ACCESSMODE := YCS_BACKGROUND_SERVICE;
finally
memo1.Lines.Add('SetDeviceInfo ... ' inttoHex(CpRegister.LastErrorCode, 8));
CpRegister.LastErrorCode := 0;
end;
bill534
一般會員


發表:38
回覆:51
積分:17
註冊:2007-02-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-05-18 16:17:14 IP:211.22.xxx.xxx 訂閱
把結構的PACKED拿掉,就正常了 ! ......

DEVICEINFO = packed record
nPortNumber: Smallint;
nCpuNumber: Smallint;
nNetWorkNumber: Smallint;
nStationNumber: Smallint;
nUnitNumber: Smallint;
strIPNumber: WideString;
nTimeout: Integer;
end;
系統時間:2017-10-20 9:35:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!