| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5064 人关注过本帖
标题:API Library 怎么用?
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
呵呵,叫我什麼都行,我的頭像就是個小孩。

授人以渔,不授人以鱼。
2012-02-11 01:51
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27165
注 册:2012-2-5
收藏
得分:0 
以下是引用Bunny008在2012-2-11 01:49:14的发言:

神大叔,还是不行,还是说“cb.dll is not a visual foxpro .exe file”...我问过同事,他说这个dll存活时间已经很久了,估计九几年出生的,最早是在win95上生存的。以前他们换系统为win98的时候也遇到过一些问题,但是他不记得是什么问题了,也不知道怎么弄得。。
你同事知道也不会告诉你的,天真的小丫头

坚守VFP最后的阵地
2012-02-11 01:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
還是找回原來那個人,不用他重寫,只要說出做了什麼的就行,按照他說的,重新做一個,好過你這樣長期亂碰。

授人以渔,不授人以鱼。
2012-02-11 01:52
Bunny008
Rank: 1
等 级:新手上路
帖 子:185
专家分:6
注 册:2011-7-27
收藏
得分:0 
回复 52楼 sdta
是啊,好像人家做事情都是要有偿的。想你们这样无私的人真是少啊。
2012-02-11 01:55
Bunny008
Rank: 1
等 级:新手上路
帖 子:185
专家分:6
注 册:2011-7-27
收藏
得分:0 
回复 53楼 TonyDeng
原来那个人。。我都不知道有没有人知道这个dll是谁写的了。。本来寄期望于我之前接手的前辈,看来不是他写的。
2012-02-11 01:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
有錢能使鬼推磨,sdta的意思是,如果你願意給錢……

授人以渔,不授人以鱼。
2012-02-11 01:58
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9831
专家分:27165
注 册:2012-2-5
收藏
得分:0 
以下是引用Bunny008在2012-2-11 01:57:28的发言:

原来那个人。。我都不知道有没有人知道这个dll是谁写的了。。本来寄期望于我之前接手的前辈,看来不是他写的。
看样子交不了差,工作。。。。。

坚守VFP最后的阵地
2012-02-11 02:02
Bunny008
Rank: 1
等 级:新手上路
帖 子:185
专家分:6
注 册:2011-7-27
收藏
得分:0 
回复 30楼 TonyDeng
神叔叔,偶还在挣扎ing.
老系统基于ISA的卡,直接写地址指令读写信号是很平常的吗?
PCI直接写似乎就复杂了点,基于ISA的卡居然不需要驱动。会不会那个CB。dll就是因为直接写了机器地址作为命令啊?

另说,既是VFP9也行啊,您给指条明路,怎么可以让它在9用啊,其他的错误我都排除了。

有新图.rar (29.91 KB)

新错误:找不到切入点啊~


[ 本帖最后由 Bunny008 于 2012-2-14 04:40 编辑 ]
2012-02-14 04:18
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
cbw32.dll是主要的东东,是硬件卡的接口。应该是厂家随硬件提供的。
提供7684个功能函数供调用。对功能和接口熟悉的话,可以直接调用----如果你有手册的话。

=============================================================================
cb.dll可看成是 接口的接口,大概是其他人为方便而写的,它调用cbw32.dll完成功能, 提供一个接口供应用程序使用,这个实际也就是一个分派函数。

cb.dll的接口只有一个,是DispatchAPI,也就是你在自己的程序中需要调用的函数。
大致的伪C代码是这样,IDA直接F5出来的,凑合看看:
int __thiscall DispatchAPI(void *this)
{
  int v1; // esi@2
  char Dst; // [sp+4h] [bp-44h]@1
  int v4; // [sp+44h] [bp-4h]@1

  v4 = (int)this;
  _memmove(&Dst, &unk_10003080, 0x40u);
  if ( !_setjmp3(&unk_10003080, 0) )
  {
    v1 = v4;
    switch ( *(_DWORD *)(v4 + 20) )
    {
      case 0:
        TlsSetValue(dwTlsIndex, *(LPVOID *)(v4 + 24));
        TlsSetValue(dword_10003064, *(LPVOID *)v4);
        TlsSetValue(dword_10003068, *(LPVOID *)(v4 + 4));
        v1 = v4;
        goto LABEL_4;
      case 0xE:
LABEL_4:
        *(_DWORD *)(v1 + 4) = 5000;
        *(_DWORD *)v1 = &FoxTable;
        break;
      default:
        break;
      case 1:
        (*(void (__thiscall **)(int))(v4 + 24))(v4 + 36);
        break;
      case 2:
        *(_DWORD *)v4 = sub_10001537(*(_DWORD *)v4, *(_DWORD *)(v4 + 4));
        break;
      case 4:
        _FreeHand(*(_DWORD *)v4);
        break;
      case 6:
        *(_DWORD *)v4 = _HandToPtr(*(_DWORD *)v4);
        break;
      case 0xA:
        (*(void (__fastcall **)(_DWORD, _DWORD))(v4 + 24))(*(_DWORD *)v4, *(_DWORD *)(v4 + 4));
        break;
      case 0xB:
        *(_DWORD *)v4 = (*(int (__fastcall **)(_DWORD, int))(v4 + 24))(*(_DWORD *)v4, v4 + 36);
        break;
      case 0x10:
        *(_DWORD *)v4 = sub_1000148C(*(_DWORD *)v4);
        break;
      case 0x11:
        sub_100014D9(*(_DWORD *)v4);
        break;
      case 0x12:
        *(_DWORD *)v4 = sub_10001510(*(_DWORD *)v4);
        break;
    }
  }
  _memmove(&unk_10003080, &Dst, 0x40u);
  return 0;
}

=======================================================
cb.dll调用了cbw32.dll中的3个函数,
cbDIn
cbDConfigPort
cbDOut
似乎都是需要3个参数。

======================================================

你既然有cbw32的LIB和H文件,完全可以根据对硬件的使用要求自己写个
DLL,或者根据需要,直接在程序里调用cbw32.dll的功能函数。
最好不要寄希望于各种碰运气形式的修改。。。。。。

win32下不管什么语言写成的DLL,格式都是一样的,知道输出函数名和参数及功能后,
就可以用各种语言规定的方式进行调用。

另外那个楼主所讲的应用中可以使用的 GET_INPUT set—output 等等几个函数
因为不是cb.dll的输出函数 所以看不到,而是
dd offset aSet_output  
dd offset @set_output@4
dd offset aIiii        
dd offset aGet_input   
dd offset @get_input@4  
这样的形式,以参数形式传给DispatchAPI,在cb.dll中再调用
cbw32.dll里的
cbDIn
cbDConfigPort
cbDOut
这3个函数来完成。

楼主提供的资料很有限,只能是这么多了。
祝LZ好运。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2012-02-14 07:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那個老系統的程序是基於Win95,Win95/98/Me與後面Win2000/XP之間的本質區別,就是前者其實基於DOS的實模式,後者才是真正分時的多用戶多任務模式。在實模式下,是應用程序調配操作系統的功能,專用于單用戶獨佔資源而設計,在這種模式下,應用程序可以直接對任何資源進行操縱,即所謂的“直接讀寫硬件”,通過引用硬件內存地址讀或者寫該處的數據。但在多用戶多任務模式下,這種直接讀寫資源的方式很容易造成衝突、非常危險,正如數據庫要考慮共享讀寫數據的機制一樣,這種模式下也要考慮共享問題,此時必須有一個總調度中心協調所有資源調配,這種調度中心就是操作系統,這個時候的機制,與實模式下完全相反,是操作系統調配應用程序,只在它認為合適的時候,才能讀寫受到保護的數據(特別是硬件數據,正如不能兩個人同時往同一塊屏幕輸出一樣),所有對資源的訪問,都要先向操作系統申請,得到允許才能成功,而且操作系統不再允許應用程序直接讀寫硬件數據,必須交由操作系統全部代理,即操作系統接收請求、獲取數據、交給應用程序這幾個步驟。這種本質上完全相反的控制原理,才是造成老系統程序無法移植的根本原因。

C程序,就是在直接操縱硬件上有先天優勢,故此你那個老程序就是採用直接讀寫硬件的方式實現的,因為那個時候的操作系統允許這樣做,但在新系統下,是絕對拒絕的——除非寫成驅動程序向操作系統請求特權。正常的做法,是使用API接口,那是操作系統與應用程序溝通的協議,用接口向操作系統遞交讀寫請求,由操作系統調度專管硬件的專用程序完成指定功能。

VFP9可以通過API接口與cbw32.dll溝通,像使用VFP內部函數一樣使用cbw32.dll的函數,只要寫一個接口介面模塊就可以了,也就是用新的模式寫cb.dll。我看那個cb.dll也是做這個事情而已,只是它當時用的是老系統模式。關鍵問題仍然是:你想做到什麼程度,以及仔細琢磨廠家提供的技術資料看是否滿足你的需求,有什麼、缺什麼、要做什麼,都要搞清楚。


[ 本帖最后由 TonyDeng 于 2012-2-14 13:19 编辑 ]

授人以渔,不授人以鱼。
2012-02-14 13:09
快速回复:API Library 怎么用?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014165 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved