我的VC版COM接口里有一个函数:
DoDsign(VARIANT varOriginalText, long lDSignMode, BSTR strAlg, VARIANT *pvarDSignData)
其中,第四个参数欲带回一个VARIANT 类型的值。我在delphi中调用的时候,首先把这个函数改写成如下:
function DoDsign(varOriginalText: VARIANT; lDSignMode: Longint; strAlg: WideString; 
var varDSignData: VARIANT): HResult; stdcall;然后实际调用的时候声明了几个对应变量如下:
lDSignMode  :Longint;
strDSignAlg :WideString;
varOriginalText :VARIANT;
varDsignData    :VARIANT;然后给前3个初始化如下:
varOriginalText :='zhangwencui做签名3次';
lDSignMode :=1;
strDSignAlg :='RSA_MD5';
然后调用如下:pS.DoDsign(varOriginalText, lDSignMode, strDSignAlg, varDsignData);pS是我的组件对象
但是程序抛出异常说:
Project.exe raised Excepption class EaccessViolation with message ‘Access Violation at address 06D1917E in module ‘MRTDCOM.dll’ .Write of address 00000100 ‘ . Process stopped ,Use Step or Run to continue,其中 MRTDCOM.dll 是我的COM组件对应的动态库。先说明的是在调用该COM组件不带返回值的函数时是没有问题的,但是当象如上那样调用要求用参数返回值时就会有问题。请各位指教。  

解决方案 »

  1.   

    先到 VC 调试你的 DLL, 看看调用进来了没有;
    再看看什么地方 Write of address 00000100(可能是写到 varDsignData 时)。建议:
    1、stdcall 的记录是通过 stack 传值的,对 VARIANT 效率不高,
       所以建议在 Delphi 声明的 [in] VARIANT 加上 const(WideString也加),
       VC 声明的 [in] VARIANT 加上 &(BSTR不加).
    2、对于 Delphi 自动初始化的类型,var 和 out 声明是不一样的。若仅用于
       输出,建议把 var 改成 out 。