delphi7调用一个vc6写的source filter中自定义接口遇到问题(200分)

  • 主题发起人 主题发起人 crazycock
  • 开始时间 开始时间
C

crazycock

Unregistered / Unconfirmed
GUEST, unregistred user!
一个用vc6写的source filter,在delphi7下面访问没有问题。为了控制这个source filter的一些设备有关的特性,自定义了一个接口,只有一个测试函数int Add(int n1,int n2),return n1+n2,就这么简单,但是接口query到了以后,在vc里调试发现,delphi那边Add(1,2)的话,vc函数里单步看到n1是一个莫名其妙的值,n2则为1。后来经过测试,发现如果测试函数定义的参数里面多加一个,例如int Add(int n0,int n1,int n2),那么delphi那边Add(1,2,3),vc里就会看到n0为莫名其妙的值,n1=1,n2=2,仿佛错位了4个字节(int类型)一样。不知道什么缘故?

下面是部分代码:
//----------------Delphi里--------------------------------
const
IID_ISimpleMath : TGUID = '{A555C1E8-69A2-4D4D-A60C-AA65E668951C}';


type
{$HPPEMIT 'typedef System::DelphiInterface <ISimpleMath> _di_ISimpleMath;'}
{$EXTERNALSYM ISimpleMath}
ISimpleMath = interface(IUnknown)
['{A555C1E8-69A2-4D4D-A60C-AA65E668951C}']
function Add(nOp1:Integer;nOp2:Integer):Integer;stdcall;

end;




//-------------VC里----------------------------------------
STDMETHODIMP CMath::QueryInterface(REFIID riid, void **ppv)
{
// 这里这是实现dynamic_cast的功能,但由于dynamic_cast与编译器相关。
if(riid == IID_ISimpleMath)
*ppv = static_cast <ISimpleMath*>(this);

else
if(riid == IID_IUnknown)
*ppv = (this);

else
{
*ppv = 0;

return E_NOINTERFACE;

}
AddRef();
//这里要这样是因为引用计数是针对组件的
return S_OK;

}
STDMETHODIMP_(ULONG) CMath::AddRef()
{
return ++m_cRef;

}
STDMETHODIMP_(ULONG) CMath::Release()
{
ULONG res = --m_cRef;
// 使用临时变量把修改后的引用计数值缓存起来
if(res == 0) // 因为在对象已经销毁后再引用这个对象的数据将是非法的
delete this;

return res;

}

int CMath::Add(int nOp1, int nOp2)
{
return nOp1+nOp2;

}


CMath::CMath()
{
m_cRef=0;

}

//-------接口定义部分--------------
#include "interface.h"

class CMath : public ISimpleMath
{
private:
ULONG m_cRef;

public:
CMath();

//IUnknown Method
STDMETHOD(QueryInterface)(REFIID riid, void **ppv);

STDMETHOD_(ULONG, AddRef)();

STDMETHOD_(ULONG, Release)();

//  ISimpleMath Method
int Add(int nOp1, int nOp2);

};
 
除了stdcall以外还有其他压栈方式,看一下两边是否匹配了!
 
我也怀疑过这个问题。但是我在delphi定义这边试了stdcall和cdecl,都是一样的效果。
 
后退
顶部