dll调用的怪现象,关于pchar和string(比较有难度) ( 积分: 200 )

你的那些数组在不移动的情况下,使用前先给其全部赋零值,再试试看,行不行??
zeromemory(@m_ReaderBuff,SizeOf(m_ReaderBuff));
 
m_ReaderBuff := AllocMem(256);
dwRetCode := SCardListReaders(m_Context,...);
......
strcopy(Readers,m_ReaderBuff);
FreeMem(m_ReaderBuff, 256)

你的这个变量“myReaders: string;”作中转基本是画蛇添足;
m_ReaderBuff这个变量不应该放在函数外声明。
 
sharemem

pchar 先分配空间
 
用PChar,array[0..255] of Char,Pointer,甚至是string,从本质上来说,应该都是可以和没有问题的,都分配了内存,函数传递过去的就是1个指针而已,大家没什么区别的。
我看了你的代码,SCardListReaders调用前m_ReaderBuffLen并没有赋初值,我不知道dll的SCardListReaders函数的参数pcchReaders: LPDWORD是否是个只传出而不需要传入值的参数,如果它内部需要pcchReaders传入值,有对pcchReaders做判断,那么你没赋初值,传入的值就是随机的,可能有时调用成功,也可能有时不成功的。
很多API,比如GetComputerName, GetUserName等
 
哦,刚才回过头去又看了一遍,这下子看清了,pcchReaders是IN OUT的,也就是说传入传出的,那么赋初值就很有必要啦
SCardListReadersA(
IN SCARDCONTEXT hContext,
IN LPCSTR mszGroups,
OUT LPSTR mszReaders,
IN OUT LPDWORD pcchReaders);
 
我用数组来试了一下我的DLL中的函数调用
var
DecryptData : array[0..1023] of byte;
begin
ZeroMemory(@DecryptData, SizeOf(DecryptData))
//在赋零值的情况下是可以正常调用的,我想大慨原因在于,以我这个例子说,假设没有赋初值,那么有时在从函数中获取值时,如果能取回来的有满1024位时,他就是正常的,如果没有返回来1024位,在这样的情况下,数组中只有部份是有数据的,而部份是空的,你再读的话,就有可能出错了。
result := XC_RSADecrypt(ih, PBuff, PBuffLen,@DecryptData, DLen, KeyType);
if result = XCR_OK then
 
可能是字节对齐的原因:
使用数据结构+指针的联合效果不错!--至今,没有错过!
对于数组得指针,需要转化类如
var
TestArray: Array of Integer;
TestPoint:pchar;
begin
setlength(TestArray,100);
TestDLL(TestPoint,@(TestArray[0]));//假设这是一个动态调用函数,
//注意TestArray[0]的用法!
end;
 
今天针对该问题,又发现了个怪现象。我在windows Xp下调试都正常了,把编译过的可执行文件,到win2000 下运行,发现取出来的数据是空的。然后我在win2000 下编译该段代码(代码没变过),取出来数据又正常了,然后把编译过可执行文件放到windows Xp下去运行,发现取出来的数据也不正常。代码基本上跟上面类似。
请大家跟踪关注该问题。
 

Similar threads

S
回复
0
查看
961
SUNSTONE的Delphi笔记
S
S
回复
0
查看
783
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部