在vc ++ win32项目中使用activex dll

时间:2009-08-21 07:15:13

标签: dll activex visual-c++ import

我有一个ScreenCameraSDK,它附带一个11kb的dll文件,它还有一个文档,列出了可以使用的功能。它说

  

ScreenCamera SDK ActiveX参考文档
  ActiveX参考

  系统上的ActiveX ID是:ScreenCameraSDK.RemoteControl
  接口上的每个方法都返回FAIL或SUCCESS。 (0或1)。
  在应用程序上创建ActiveX实例,然后调用InitializeScreenCameraRemoteControl。如果返回值为SUCCESS,则正确安装ScreenCamera,然后您可以调用ActiveX接口上的任何其他方法。如果没有找到ScreenCamera,您应该联系支持部门。**

现在我的问题是,我有dll而没有其他文件。如何在Visual Studio 2008的VC ++项目中使用其中的函数。 感谢

我试过以下代码,但是未定义标识符的GOT编译错误

  #include <stdio.h>

      // This is the path for your DLL.
      // Make sure that you specify the exact path.

      #import "e:\ScreenCameraSDK.dll"  no_namespace

      void main()
      {
       BSTR bstrDesc;

      try
      {
      CoInitialize(NULL);
      short st = 2;
       short st1;
      // Declare the Interface Pointer for your Visual Basic object. Here,
      // _Class1Ptr is the Smart pointer wrapper class representing the
      // default interface of the Visual Basic object.

      _Class1Ptr ptr;
      // Create an instance of your Visual Basic object, here
      // __uuidof(Class1) gets the CLSID of your Visual Basic object.

       ptr.CreateInstance(__uuidof(Class1));
       st1 = ptr->MyVBFunction(&st);
      }
      catch(_com_error &e)
      {
       bstrDesc = e.Description();

      }
      CoUninitialize();
      }

它说_Class1Ptr是未知的!

2 个答案:

答案 0 :(得分:2)

BSTR bstrDesc;

try
{
    HRESULT hr= CoInitialize(NULL);
    CLSID clsid;
    hr = CLSIDFromProgID(OLESTR("<complete class name as see in registry>"),&clsid);
    short st = 2;
    short st1;

//nameOfClassInOCX  is placeholder for explanation. If you OCX com class name is blabla
    //use _blabla and so on. 

    _nameOfClassInOCX * ptr;

    hr = CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(_nameOfClassInOCX ),(LPVOID*)&ptr);  

    cout << ptr->GetFees("hi") <<endl;
    ptr->Release();
}
catch(_com_error &e)
{
         bstrDesc = e.Description();
}

CoUninitialize();

答案 1 :(得分:0)

首先,您必须执行此操作#import dll,编译器将自动生成所有必需的定义。然后使用智能指针或CreateInstance()创建库中的对象。

#import "C:\files\test.dll"    no_namespace rename("EOF", "EOFile")

...
int main() {
   if (FAILED(::CoInitialize(NULL)))
      return 0;
    ........
   ::CoUninitialize();
   return 0;
}