描述:
小弟初学以的代码是我看别人的程序乱写的请问我应该怎么改在Application中运行这个DLL呀?谢谢!
//Testlib.def
; TestLib.def : Declares the module parameters.
LIBRARY "TestLib"
DESCRIPTION 'TestLib for TestCom by (C) 2004'
EXPORTS
DllAddNum @1
//Testlib.cpp
#include <windows.h>
#include "TEST.h"
// dll's main entry
BOOL WINAPI DllMain(HINSTANCE hmod,DWORD dwReason,LPVOID lpvReserved){
switch( dwReason ) {
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
} // DllMain
HRESULT WINAPI DllAddNum(DWORD *dwNum){
dwNum += 10;
return S_OK;
}
//ITEST.h
#if !defined(ITEST_H)
#define ITEST_H
#include "Objbase.h"
typedef struct ITEST* LPITEST;
#undef INTERFACE
#define INTERFACE ITEST
DECLARE_INTERFACE_( ITEST, IUnknown )
{
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release)(THIS) PURE;
STDMETHOD_(DWORD,GetNum) (THIS) PURE;
STDMETHOD(AddNum) (THIS_ DWORD dwNum) PURE;
};
HRESULT WINAPI DllAddNum(DWORD *dwNum);
#endif
//Test.h
#if !defined(AFX_TEST_H__1471A3C0_8213_4229_AA89_DA0DA977F55C__INCLUDED_)
#define AFX_TEST_H__1471A3C0_8213_4229_AA89_DA0DA977F55C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "ITEST.h"
class TEST:ITEST
{
public:
TEST();
virtual ~TEST();
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
STDMETHODIMP_(DWORD) GetNum(void);
STDMETHODIMP SetNum(DWORD dwNum);
protected:
DWORD dwNum;
long m_lRef;
};
#endif
//TEST.cpp
#include "TEST.h"
TEST::TEST(){dwNum = 0;}
TEST::~TEST(){}
STDMETHODIMP TEST::QueryInterface(REFIID riid, LPVOID* ppv){
if (!this)
return ResultFromScode(E_INVALIDARG);
*ppv = this;
((LPUNKNOWN)*ppv)->AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) TEST::AddRef(void){
if (!this)
return 0;
InterlockedIncrement(&m_lRef);
return m_lRef;
}
STDMETHODIMP_(ULONG) TEST::Release(void){
if (!this || m_lRef == 0)
return 0;
InterlockedDecrement(&m_lRef);
return m_lRef;
}
STDMETHODIMP_(DWORD) TEST::GetNum(void){return dwNum;}
STDMETHODIMP TEST::SetNum(DWORD dwNum){this->dwNum=dwNum;}
解决方案1:
就是用SDK写一个COM组件呀!
1. implement DllGetClassObject in your server component
STDAPI DllGetClassObject(
REFCLSID rclsid,
REFIID riid,
PPVOID ppv)
{
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
IUnknown* pCob = NULL;
if (CLSID_DllTest == rclsid)
{
hr = E_OUTOFMEMORY;
pCob = new TEST();
}
if (NULL != pCob)
{
hr = pCob->QueryInterface(riid, ppv);
if (FAILED(hr))
{
DELETE_POINTER(pCob);
}
}
return hr;
}
首先创建一个接口实现类的实例,然后调用它的QueryInterface。
2. On client side, call CoCreateInstance().
CoCreateInstance will call DllGetClassObject in your server component