我们知道进程都有自己的进程空间,都有自己的起始地址,因此在一个进程中的指针在另外一个进程中是无效的,一般在一个进程中的使用的地址类型的指针在进程之间传递时是
不能使用的,经过笔者测试,如果我们传递接口指针则不会出现该问题,但要注意的是要自己实现该接口,比如IStream*现在举例如下:
//这是测试的代码
STDMETHODIMP Csimple::test (IStream* psim)
{
char buf[100]={0};
psim->Read(buf,100,NULL);
MessageBoxA(NULL,buf,0,0);
return S_OK;
}
这是我们测试的代码
#include "stdafx.h"
#include
#include
#include"interface.h"
#include"mytype.h"
using namespace std;
#import"D:\project\StreamImp\Debug\StreamImp.dll"no_namespace
extern "C" const GUID IID_Isimple=
{
0xEFEFD281,0xBF44,0x416B,{0xBF,0x21,0x82,0xBA,0x42,0xF5,0x8A,0x4D}
};
extern "C" const GUID CLSID_simple=
{
0xB9FB4559,0x22AB,0x4D9E,{0xA0,0xE1,0xE2,0x89,0x3C,0x54,0x40,0x25}
};
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize (NULL);
IUnknown*pUnk=NULL;
Isimple* psim=NULL;
HRESULT hr=::CoCreateInstance(CLSID_simple,NULL,CLSCTX_LOCAL_SERVER,IID_Isimple,(void**)&pUnk);
if(S_OK==hr)
{
cout<<"CoCreateInstance successfully\n";
}
else
return 0;
hr=pUnk->QueryInterface(IID_Isimple,(void**)&psim);
if(S_OK==hr)
{
cout<<"QueryInterface successfully\n";
}
else
return 0;
ISimPtr sin;
sin.CreateInstance(__uuidof(Sim));
IStream*heh;
sin.QueryInterface(IID_IStream,(void**)&heh);
heh->Write("fsadas",100,NULL);
hr=psim->test (heh);
sin.Release();
psim->Release();
pUnk->Release();
return 0;
}
这是进程外组件参数的传递