现在我手上有个COMDll.dll与COMDll.tlb文件,我通过添加ACTIVE控件的形式将COMDll.tlb添加到工程中,结果出现一个CCOMLink.h和CCOMLink.cpp
下面是CCOMLink.h前面的一段代码:
class CCOMLink : public CWnd
{
protected:
DECLARE_DYNCREATE(CCOMLink)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x59BE3F11, 0xF1F, 0x4EC0, { 0xA4, 0xCC, 0x75, 0x57, 0xDC, 0xA5, 0x3B, 0x16 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
} BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey);
}// 属性
public:// 操作
public:
BOOL OpenCOM(long Net, LPSTR COM, long BaudRate)
{
BOOL result;
static BYTE parms[] = VTS_I4 VTS_UNKNOWN VTS_I4 ;
InvokeHelper(0x2, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Net, COM, BaudRate);
return result;
}
}
我在程序中如此调用函数,结果每次都出断言错误
/*初始化COM组件*/
CoInitialize(NULL);
AfxEnableControlContainer();
CRect rt;
GetClientRect(&rt);
m_pCISComLink = new CCOMLink();
BOOL bCreate = m_pCISComLink->Create("CCOMLink",NULL,WS_CHILD|WS_VISIBLE,rt,this,0,NULL);
BOOL bOpenCom = m_pCISComLink->OpenCOM(0,"COM1",9600);
发现bCreate 返回都是0,不知道那个Create的那个函数的各个参数怎么调用?小弟第一次做这种DLL调用没有经验,请各位大虾帮我看看,如果不是上面那种方式调用,请问我该怎么调用才能正常调用,分不够我可以加,谢谢,十万火急!
下面是CCOMLink.h前面的一段代码:
class CCOMLink : public CWnd
{
protected:
DECLARE_DYNCREATE(CCOMLink)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x59BE3F11, 0xF1F, 0x4EC0, { 0xA4, 0xCC, 0x75, 0x57, 0xDC, 0xA5, 0x3B, 0x16 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
} BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey);
}// 属性
public:// 操作
public:
BOOL OpenCOM(long Net, LPSTR COM, long BaudRate)
{
BOOL result;
static BYTE parms[] = VTS_I4 VTS_UNKNOWN VTS_I4 ;
InvokeHelper(0x2, DISPATCH_METHOD, VT_BOOL, (void*)&result, parms, Net, COM, BaudRate);
return result;
}
}
我在程序中如此调用函数,结果每次都出断言错误
/*初始化COM组件*/
CoInitialize(NULL);
AfxEnableControlContainer();
CRect rt;
GetClientRect(&rt);
m_pCISComLink = new CCOMLink();
BOOL bCreate = m_pCISComLink->Create("CCOMLink",NULL,WS_CHILD|WS_VISIBLE,rt,this,0,NULL);
BOOL bOpenCom = m_pCISComLink->OpenCOM(0,"COM1",9600);
发现bCreate 返回都是0,不知道那个Create的那个函数的各个参数怎么调用?小弟第一次做这种DLL调用没有经验,请各位大虾帮我看看,如果不是上面那种方式调用,请问我该怎么调用才能正常调用,分不够我可以加,谢谢,十万火急!
/*注册组件*/
CString strFileName = m_strCurrentDir + CString("\\COMDll.dll");
HMODULE hDLL = ::LoadLibrary(strFileName);
if(hDLL)
{
FREG lpfunc = (FREG)::GetProcAddress(hDLL,_T("DllRegisterServer"));
if(lpfunc) lpfunc();
::FreeLibrary(hDLL);
}
这里断点通过正常。
BOOL bCreate = m_pCISComLink-> Create(NULL,"CCOMLink",WS_CHILD ¦WS_VISIBLE,rt,this,0,NULL);
返回还是0
看了一下Resource中没有ID =0的
hh值发挥14007
什么密钥值在哪儿能找到?找遍整个动态连接库没发现有什么密钥值!
需要填入密钥值是不是就意味着我要调用下面那个Create,您看我这样调行吗?
BOOL bCreate = m_pCISComLink->Create("CCOMLink",WS_CHILD ¦WS_VISIBLE,rt,this,0,0,0,(_bstr_t)"HX_abcdx123");
AHXMachine : ICOMLink ; // 定义接口变量
Function MachineDll(index:integer):ICOMLink ; stdcall; external 'COMDll.dll'; // 声明动态库接口函数// 实例化接口 下面 2个方法 皆可index 从0 开始,可以定义多个接口
AHXMachine := MachineDll(0); // 通过动态库函数产生接口实例
AHXMachine := CoCOMLink.Create; // 通过接口类产生接口实例
他dephi是这样调用的,我dephi不是很懂。
Function MachineDll(index:integer):ICOMLink ; stdcall; external 'COMDll.dll'; // 声明动态库接口函数这句话用C++怎么写