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

呼叫DLL的問題

答題得分者是:fangwy
Nelson Lo
一般會員


發表:35
回覆:87
積分:24
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-24 09:17:50 IP:61.221.xxx.xxx 未訂閱
請教各位先進 小弟我有一個儀表提供的可能是C 寫的DLL 他的C 範例程式的宣告是 OEMDllImportExport BOOL WINAPI COT( int Channel, int* TimePS ); 呼叫方法是 int nPs; COT( 1 , &nPs ); 我用delphi呼叫,宣告是 function COT(Channel : integer ; var TimePS : integer) : boolean; stdcall;external 'OEM.dll'; 呼叫方法是 var nPs : integer; COT( 1 , nPs ); 我也有試過用 cdecl 的呼叫規則 但是都會出現錯誤訊息 "Invalid floating point operation" 請問是我語法錯誤了嗎 還是哪裡漏掉了 謝謝回應
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-24 09:52:44 IP:219.68.xxx.xxx 未訂閱
宣告 function COT(Channel : integer ; TimePS : PInt) : BOOL; Implementation: function COT; external 'OEM.dll'; 呼叫方法:
var
 nPs:PInt;
begin
 GetMem(nPs, SizeOf(integer));
 COT(1, nPs);
 ...
 FreeMem(nPs);
end;
發表人 - chris_shieh 於 2004/12/24 10:07:42
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-24 09:55:51 IP:218.5.xxx.xxx 未訂閱
好象C 中int是16bit,而integer是32bit,你可试试用word或Smallint. function COT(Channel : Smallint; var TimePS : Smallint) : boolean; stdcall;external 'OEM.dll'; var nPs : Smallint; COT( 1 , nPs );
Nelson Lo
一般會員


發表:35
回覆:87
積分:24
註冊:2003-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-24 09:59:32 IP:61.221.xxx.xxx 未訂閱
感謝您的回應 但是我試了還是一樣的錯誤訊息耶
Nelson Lo
一般會員


發表:35
回覆:87
積分:24
註冊:2003-04-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-24 10:03:49 IP:61.221.xxx.xxx 未訂閱
謝謝fangwy 的回應 我試了word和Smallint 都是一樣呢
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-24 10:39:58 IP:218.5.xxx.xxx 未訂閱
我在网上搜了一把,发现多数询问"Invalid floating point operation"的都是在某些数据处理时发生,没有找到关于动态库处理的情况,也许你可以用C 调用这个功能试试,可能根本就是动态库的问题. 另外可能试试: PSmallint = ^Smallint; function COT(Channel : integer ; TimePS : PSmallint ) : boolean; stdcall;external 'OEM.dll'; var nPs : Smallint; COT( 1 , PSmallInt(nPs) ); 我给你提供的两种方法,在我的应用中都可行.只不过我的DLLS也是我写的,我能保证DLLS没问题.
Nelson Lo
一般會員


發表:35
回覆:87
積分:24
註冊:2003-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-24 11:04:47 IP:61.221.xxx.xxx 未訂閱
fangwy 兄 我有試過用 VB 和 C 去呼叫 都沒有問題 可以運行 所以真的很傷腦筋呢
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-24 11:13:00 IP:218.5.xxx.xxx 未訂閱
这样吧,你把动态库发一份给我,我帮你试试,看看是否能解决. MAIL是fangwy@yeah.net
Nelson Lo
一般會員


發表:35
回覆:87
積分:24
註冊:2003-04-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-24 11:44:30 IP:61.221.xxx.xxx 未訂閱
fangwy 兄 我已經發給您了 謝謝
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-24 12:05:51 IP:219.68.xxx.xxx 未訂閱
您好 試過了嗎
宣告
function COT(Channel : integer ; TimePS : PInt) : BOOL;    Implementation:
function COT; external 'OEM.dll';    呼叫方法:    var
 nPs:PInt;
begin
 GetMem(nPs, SizeOf(integer));
 COT(1, nPs);
 ...
 FreeMem(nPs);
end;
Nelson Lo
一般會員


發表:35
回覆:87
積分:24
註冊:2003-04-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-24 12:37:36 IP:61.221.xxx.xxx 未訂閱
chris_shieh 兄 感謝您的持續關心 您的方法小弟也已經試過了 還是一樣的錯誤訊息
fangwy
中階會員


發表:99
回覆:139
積分:62
註冊:2003-09-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-12-24 15:37:08 IP:218.5.xxx.xxx 未訂閱
不好意思,没搞定,这个错误是EInvalidOp类错误. 提供一个链接: http://it.yn.cninfo.net/pubnews/doc/read/8742421943220786691/103.oldsystem14.4726/index.asp 摘要: EInvalidOp最常见的引发原因是没有协处理器的机器遇到一个协处理器指令。由于在缺省情况下Delphi总是把浮点运算编译为协处理器指令,因而在386以下微机上常常会碰到这个错误。此时只需要在单元的接口部分设置全局编译指示{$N-},选择利用运行时间库进行浮点运算,问题就可以解决了。 各种类型的浮点数(Real、Single、Double、Extended)越界引起同样的溢出异常。这同整数异常类是不同的。 有空我再试试,你再请教一下其他大大,如果有结果,麻烦贴出来,谢谢
Nelson Lo
一般會員


發表:35
回覆:87
積分:24
註冊:2003-04-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-12-25 08:15:01 IP:218.162.xxx.xxx 未訂閱
fangwy 兄 這一段我也有看過 可是還是無法解決 我現在是先用C 寫一個小程序負責呼叫DLL 我再用delphi sendmessage 給小程序 小程序得到數據以後再sendmessage 給delphi 等於是多一層 脫褲子放屁一樣 真麻煩 這個問題我一定要找出答案 對了 我是用 delphi 5 不過還是很感謝您
系統時間:2024-06-30 11:24:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!