我的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组件不带返回值的函数时是没有问题的,但是当象如上那样调用要求用参数返回值时就会有问题。请各位指教。
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组件不带返回值的函数时是没有问题的,但是当象如上那样调用要求用参数返回值时就会有问题。请各位指教。
解决方案 »
- 使用ADOQuery.UpdateBatch后,怎样获取未成功提交的记录?
- excel操作﹐請問如何復制一個工作表?
- 关于websnap一点小问题!~~~~~~~~~~~
- 菜鸟问题:如何能反馈cmd中的结果??
- 请问JPG图形的缩放(W和H变小变大)
- 如果用js调用activeform里的方法?
- 关于代码排版的expert。是钱达智大侠写的。
- 将Excel数据表中数据用treeview显示,并导出XML文件~~ 彻底崩溃中!!! 新手分数不多,日后一定报答 付费也可
- 我现在用delphi写一个和字符叠加器带一个Wordover.exe,要和这个软件来通信;
- 谁用过DFS控件包中的SystemTreeView等类似WIN资源管理器的控件?
- ->>200分求sql统计语句....跟贴有分.
- 随机抽奖的程序
再看看什么地方 Write of address 00000100(可能是写到 varDsignData 时)。建议:
1、stdcall 的记录是通过 stack 传值的,对 VARIANT 效率不高,
所以建议在 Delphi 声明的 [in] VARIANT 加上 const(WideString也加),
VC 声明的 [in] VARIANT 加上 &(BSTR不加).
2、对于 Delphi 自动初始化的类型,var 和 out 声明是不一样的。若仅用于
输出,建议把 var 改成 out 。