现在我手上有个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调用没有经验,请各位大虾帮我看看,如果不是上面那种方式调用,请问我该怎么调用才能正常调用,分不够我可以加,谢谢,十万火急!

解决方案 »

  1.   

    [align=left]组件我已经注册
    /*注册组件*/
    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);
    }
    这里断点通过正常。
      

  2.   

    改成:
      BOOL   bCreate   =   m_pCISComLink-> Create(NULL,"CCOMLink",WS_CHILD ¦WS_VISIBLE,rt,this,0,NULL); 
      

  3.   

    BOOL   bCreate  =  m_pCISComLink->Create(NULL,"CCOMLink",WS_CHILD¦WS_VISIBLE,rt,this,0,NULL);
    返回还是0
      

  4.   

    nID参数是0,有没有跟其它子窗口的ID重复?
      

  5.   

    nID参数是0,有没有跟其它子窗口的ID重复?
    看了一下Resource中没有ID =0的
      

  6.   

    DWORD hh = GetLastError();
    hh值发挥14007
      

  7.   

     bstrLicKey,需要填入密钥值
      

  8.   

    bstrLicKey,需要填入密钥值
    什么密钥值在哪儿能找到?找遍整个动态连接库没发现有什么密钥值!
    需要填入密钥值是不是就意味着我要调用下面那个Create,您看我这样调行吗?
    BOOL       bCreate  =   m_pCISComLink->Create("CCOMLink",WS_CHILD ¦WS_VISIBLE,rt,this,0,0,0,(_bstr_t)"HX_abcdx123");   
      

  9.   

    2定义一个 动态库函数  如下,使用MachineDll 做为一个对象 只能有一个做为全局变量 
    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++怎么写
      

  10.   

    我现在也用于这个COMDLL.DLL这个动态库,在PB里不能调用.现在正狂晕中.有哪位大侠解决问题的.希望可以救一下小弟.小弟Q529466586