我遇到难题了,请各位帮助!(200分)

  • 主题发起人 主题发起人 jiangxk
  • 开始时间 开始时间
J

jiangxk

Unregistered / Unconfirmed
GUEST, unregistred user!
我用vc写了一个des加密的dll(没有用mfc)
另外我用delphi写了一个com组件,在com组件里面调用dll里面的函数,
在com组件里面,dll的函数声明如下
function EncAscFile(sInFile: string;sOutFile:string):integer; safecall;
external 'crypt.dll';
function DecAscFile(sInFile: string;sOutFile:string):integer; safecall;
external 'crypt.dll';
function encryptstr(instr: string;outstr: string):integer; safecall;
external 'crypt.dll';
function decryptstr(instr: string;outstr: string):integer; safecall;
external 'crypt.dll';

我在com组件里面有这样一个函数
function xxx(...);
begin
....
EncAscFile('c:/a.txt','c:/b.txt');
....
end;
在调用这个函数的过程中没有问题,但是总是执行到end语句的时候,会出现
“access violation at 0x78027835 :read of address 0x00000002”
的错误。

我用显式调用和隐式调用都会出现这个错误,
但是我在用delphi写的application里面调用这个dll就没有问题。
请问各位遇到过这种问题没有?怎么解决的?谢谢!
 
可能是 string 的問題吧
uses sharemen 了嗎?

為甚麼不用PChar?
 
在动态链接库中,定义最好不要用string变型 ,可以用Pchar
string 类型好像行不通。
 
同意楼上
 
shortstring
 
试试 EncAscFile(pchar('c:/a.txt'),pchar('c:/b.txt'));
 
可是 我在dll里面添加一个
void aa(void)
{
MessageBox(NULL,"a","a",MB_OK);
}
函数
我在com组件里面调用,同样会在end的地方报错
 
我用pchar来传参数,可以还是不行啊
 
1。先测试一下Dll有没有问题。
2。应该使用PChar传递参数
 
如果字符串不长的话,建议使用ShortString类型;
如果可能超过256个字符呢,建议采用WideString类,但不要使用String类型。
 
改一下声明 :
function EncAscFile(sInFile: pchar;sOutFile:pchar):integer; safecall;
external 'crypt.dll';
然后用以下形式:
EncAscFile(pchar('c:/a.txt'),pchar('c:/b.txt'))


EncAscFile('c:/a.txt','c:/b.txt')
 
com里面最好用wideString
 
看看你的动态链接库的调用方式确实是safecall吗,
或许是stdcall?cdecl?pascal?register?
 
可能是由于字符串的问题,因为在C里面为"c://a.txt",而在delphi里面是'c:/a.txt',我
就曾经遇到过。对于调用时用指针就可以了。
 
我想你在 dll 中的是 SafeCall 吗,在普通的Dll中还是用 stdcall吧。safecall只有在
Com组件这样dual-interface中的才用。
 
后退
顶部