是这样的情况:录入学生姓名的同时需要将学生姓名和考勤机的卡号写入考勤机中去,考勤机厂商给了一个调用接口函数的dll,比如插入记录的函数CFInsertCard ();厂家给我的函数定义如下
INTEGER CFInsertCard(LONG HCF,INTEGER DeviceID,INTEGER No,LONG ID,STRING * Name)。
功能说明: 增加(修改)一张卡片资料。
参数说明:LONG HCF 设备标识号(由CFCreateDevice()函数返回得到)。
INTEGER DeviceID 设备ID号,范围为1~99。
INTEGER No 卡片流水编号,取值范围为1~5000;
LONG ID ID卡的卡片内码序号。
INTEGER * Name 姓名,最长为4个汉字(注意:空格符号请输入国标码的空格符号)。
返回值:
0 设置成功。
1 设置失败。
2 参数不符合取值范围。请教各位的是STRING * Name是在C++中是字符串指针吧,在DELPHI中如何将姓名字符串转换成字符串指针呢?请指教,不甚感激
还有如果输入的姓名不满4个字时候,"空格符号请输入国标码的空格符号",DELPHI中应该怎么处理呢?谢谢
INTEGER CFInsertCard(LONG HCF,INTEGER DeviceID,INTEGER No,LONG ID,STRING * Name)。
功能说明: 增加(修改)一张卡片资料。
参数说明:LONG HCF 设备标识号(由CFCreateDevice()函数返回得到)。
INTEGER DeviceID 设备ID号,范围为1~99。
INTEGER No 卡片流水编号,取值范围为1~5000;
LONG ID ID卡的卡片内码序号。
INTEGER * Name 姓名,最长为4个汉字(注意:空格符号请输入国标码的空格符号)。
返回值:
0 设置成功。
1 设置失败。
2 参数不符合取值范围。请教各位的是STRING * Name是在C++中是字符串指针吧,在DELPHI中如何将姓名字符串转换成字符串指针呢?请指教,不甚感激
还有如果输入的姓名不满4个字时候,"空格符号请输入国标码的空格符号",DELPHI中应该怎么处理呢?谢谢
解决方案 »
- delphi 如何做软件左侧导航
- 如何在FR中动态显示图片?
- 关于数组的问题?菜
- 欢迎大家下载我的软件,下载者有分.
- 如何让treeview的节点响应事件,如单击双键可以修改,或单击将其内容转到一个edit中
- 高分请教十六进制和ascii码互相转换问题
- 老大们救命阿!!! 为什么会有Cannot focus a disabled or invisible window 的错误? 500分求解!!!!! 十万火急急啊!!!
- 好东东!134种特效显示!大家去下啊! 最好有人能改成for D6的!改完发一份给我啊!
- tgroupbox控件与tradiogroup控件的区别
- 关于Font的保存,谁能帮我?
- TStringGrid的2个问题
- 怎样导入.mdf文件到SQL Server?
//======
interface
CFInsertCard: function(HCF: LongInt;
DeviceID: INTEGER;
No: INTEGER;
ID: LongInt;
var Name: STRING): INTEGER stdcall;
//=======
implementationfunction CFInsertCard; external 'XXXXXXX.DLL';
先得到姓名的长度,用Length();
差几个就用' '补为8个字节;
我的代码是这样的,可以吗?
procedure LoadDLL;
var
hDll: THandle;
begin
hDll := LoadLibrary('CF898.dll');
if hdll < 32 then begin
Showmessage('加载DLL出错!');
exit;
end else
begin
@CFCreateDevice := GetProcAddress(hDll, 'CFCreateDevice');
@CFCloseDevice := GetProcAddress(hDll, 'CFCloseDevice');
@CFInsertCard := GetProcAddress(hDll, 'CFInsertCard');
@CFDeleteCard := GetProcAddress(hDll, 'CFDeleteCard ');
end;
end;
执行插入操作的时候
begin
loaddll;
ret := CFCreateDevice(i);
if ret = 0 then
begin
abort;
end;
if ret <> 0 then
begin
CFInsertCard(i, 01, 01, id, name);
end;
end;
INTEGER CFInsertCard(LONG HCF,INTEGER DeviceID,INTEGER No,LONG ID,STRING * Name)。Function CFInsterCard(HCF: LongInt;
DeviceID: Integer ;
No: Integer;
ID: LongInt
Name: PChar):Integer;Cdel;2、INTEGER* Name 可能与PChar对应(不能确定)
Name的对应参数要说明为 NameStr: Array[0..7] Of Char;3、调用:CFInsterCard(HCF,DeviceID,No,ID,@NameStr)
4、参考回贴:
http://expert.csdn.net/Expert/topic/2237/2237804.xml?temp=.23164
ID: LongInt; Name: PChar):Integer;stdcall;external youdll name 'CFInsterCard'
string * name 在C里面就是字符串指针,所以Delphi里声明成pchar。
我调用厂家给DLL,只能动态调用吧,没有LIB文件可以静态调用吗?
请高手指点
恕我孤陋寡闻
不过还是查查string到底是什么类型吧
一般,c++ c 中的字符串是用字符指针操作的:char * name;
在delphi中,pchar类型就是c++ c类型的字符指针 他们完全一样的
现在奇怪的是我在调试程序的时候发现
var
names: string;
NameStr:Array[0..7] Of Char;
id:integer;
begin
StrPCopy(namestr, 'nihaoa');
showmessage(inttostr(CFInsertCard(1,1,1,1234567890,namestr)));
end;
程序运行后,发现返回的值是1808881154
而厂家定义的函数的返回值只有0,1,2三种
请问这是什么原因啊,谢谢!
http://www.bluejacky.com/download/cftest.rar
或许是bcb写的dll,试试showmessage(inttostr(CFInsertCard(1,1,1,1234567890,@namestr)));
改成showmessage(inttostr(CFInsertCard(1,1,1,1234567890,@namestr)));后
返回值仍然是1808881154
这是咋回事啊
因为并没有传入string类型的参数
正如 Seahilly(小峰) ( ) 写的:Function CFInsterCard(HCF: LongInt;
DeviceID: Integer ;
No: Integer;
ID: LongInt
Name: PChar):Integer;Cdel;
我下你的包来看了一下,改后,我直接掉CFInsterCard返回为1,只不过函数完成后会报错。
是不是先要初始化什么的。我提醒一句,这个dll是共享mfc的dll,如果仍然出问题,你还是自己联系一下厂商。
我的意思是DLL有C语言调用的源程序例子么?
有就好办多了。
Pchar 好像只能和void *划等号的吧。
to whaway(湘北清翔): 没有例子程序啊,厂家就给了个DLL和函数说明
感谢各位的帮助,我快要结贴了
这问题我在C/C++里也贴了,各位可以去下面的帖子UP一下,我会把分分给各位的,谢谢
http://expert.csdn.net/Expert/topic/2871/2871813.xml?temp=.2039301
typedef std::string STRING ?
typedef char STRING ?
typedef char* STRING ?
typedef w_tchar STRING ?
还是
typedef w_tchar* STRING ?
我原来看英文的说明书觉得很不爽的前一段时间看了深圳和山东的两家公司的说明书后
就觉得看英文说明是非常简单的,一就是一,说得非常清楚
而且很多都是有例子的不过针对你现在的函数,
我猜 99.9999% 是这样的
int iName[8];
char *pName = iName;
ZeroMemory(iName, sizeof(int)*8);
iName[0]=3326; //梁 字,我的姓
iName[1]=XXXX;
iName[2]=XXXX;
iName[3]=XXXX; CFInsertCard(...,pName);
声明为 pchar 即可
不过这些函数确实是 cdecl 方式调用的
iName[0]=0x3326; //梁 字,我的姓