如可在MFC中载入一个外设提供的.DLL库(控件),然后调用里面封装的函数.....请高手说的详细点....谢过!

解决方案 »

  1.   

    1.装载期间动态链接调用
    把你编写的 .dll  .lib  和 .h 文件加入工程
    在本工程头文件中加入 #pragma comment(lib,"链接库名称,如myDllDemo")
    这样你的程序就可以像调用本地函数一样调用Dll中的函数。2.运行期间动态链接
    在Dll工程中加入一个。Def文件  在其中加入要导出的函数名,如:
    EXPORTS 
          myFounction
    回到本工程,调用方法:
     HMODULE hModule = ::LoadLiabrary("..\\..\\..\\myDllDemo.dll");
    if(hModule != NULL)
    {
    PFNEXPORTFUNC mExportFunc =(PFNEXPORTFUNC)::GetProcAddress(hModule,"myFounction");
    if(mExportFunc != NULL)
    {
        mExportFunc(参数);
    }
    ::FreeLibrary(hModule);
    }
      

  2.   

    LoadLibrary
    GetProcAddress
    其他的楼上都说了!
      

  3.   

    谢谢各位.....
    按照你们所说我加载了DLL运行到如下A处时提示所读内存出错!我仔细看了一下厂商提供的示例代码(VB)他是把zkemKeeper.dll以控件的方式加入,(通过coponent......方式找到注册的zkemKeeper.dll)然后就可以直接拖入对话框使用,我用MFC通过project----->add to project-->component and control..加入zkemKeeper.dll时系统提示所选文件为不可以识别component..
    怎么都加不进去,还请大家帮帮忙!
    HINSTANCE hit =  LoadLibrary(TEXT("zkemKeeper.dll"));
     
    if (hit)
    {
    connect1 = (pConnect_Net *)GetProcAddress(hit,"Connect_Net");
    }
    int port = 4370;
    CString TMP = "172.16.2.201";
    BSTR STR = TMP.AllocSysString();
    BOOL flag1 = connect1(STR,port); //A

    if (flag1)
    {
    AfxMessageBox("ok!");
    }
      

  4.   

    系统提示所选文件为不可以识别component..这种商业代码啊  谁知道在有没有自己的规则。
      

  5.   

    MFC中你那样加入的是ActiveX控件。厂商提供的可能是简单Com组件,这样的话用vb就比较简单,用vc的话,你就要添加代码引用
    #import "XXXXX.dll" no_namespace named_guids raw_interfaces_only
    编译后会出现XXXXX.dll的接口文件比如说 ISample接口
    你定义一个这个接口变量。
    ISamplePtr m_Com;
    m_Com.CreateInstance(_T("XXXXXX.类名.1"));
    这就可以用m_Com.调用接口提供的函数。
    如果有事件的话就比较麻烦,你要连接Com组件的连接点。
      

  6.   

    我注册了控件之后,然后在资源编辑器里,右击一dialog,选Insert Activx Components,找出控件,加载成功,担是ClassWizard没有替控件生成类,这个控件是一个空的没有事件(在VB中加载是正常的有事件)不知道哪里出了问题.........
     能把控件加载进去是不是可以说明这个.DLL文件支持VC++开发工具呢?
    (希望大家帮帮忙,问题解决另开帖追加分!)
      

  7.   

    要生成控件类,你按ctrl+w 在classwizard里有个按钮AddClass 选择from a type library然后选择你的xxxx.dll就会出现控件类了。
    应该是说这个dll是ActiveX控件。很多语言都能使用他,vc当然不例外
      

  8.   

    谢谢楼上.....按照你的说法我已经把DLL载入了对应的类和一些函数都可以使用了.
    再问一下ActiveX控件是不是不能在MFC控件栏中出现啊(为什么VB中可以呢,加入后在控件栏中可以找的到)!
      

  9.   

    可以啊,MFC通过project----->add to project-->component and control加入后在控件栏就可以看到了。
      

  10.   

    MFC通过project----->add to project-->component and control加入后在控件栏就可以看到了。
    我用这种方式加载时系统提示:the file you have selected is not a recognizable component
    如果在DIALG对话框中点右键加入ACTIVE CONTROL可以加入控件图标但是这个控件没有相映事件!
      

  11.   

    你是不是没有调用
    if (!AfxOleInit())
    {
    return FALSE;
    }
      

  12.   

    AfxOleInit()请问楼上这是什么函数啊?
      

  13.   

    我用了AfxOleInit()函数一样没有用啊
    Visual Studio 2005和VC++6.0是不是兼容的,我想改用Visual Studio 2005试下
    结果不好用,连MESSAGEBOX()都弹不出来不会连语法都变了吧,
    我在VC++6.0下编的程序在Visual Studio 2005中不能运行.....类向导好像也变了
    那位知道Visual Studio 2005告诉我怎么入门吧!.....急啊谢过!
      

  14.   

    第一步 #pragma comment(lib,"链接库名称,如myDllDemo")
    第二步  HMODULE hModule = ::LoadLiabrary("..\\..\\..\\myDllDemo.dll");
    if(hModule != NULL)
    {
    PFNEXPORTFUNC mExportFunc =(PFNEXPORTFUNC)::GetProcAddress(hModule,"myFounction");
    if(mExportFunc != NULL)
    {
        mExportFunc(参数);
    }
    ::FreeLibrary(hModule);
    }这样没问题吧,开始也不需要把你的DLL导入工程中吧
      

  15.   

    应该没什么问题了,怎么还不行呢.
    要不再测试下厂商vb程序,仔细看下vb程序,应该跟vc差不多.
    你转到2005干什么呢,不用CLR就不要换了,还不如直接用vb写,来的快.
      

  16.   

    VB以前没怎么用过作起来不方便时间也不充许.....我试了一下从类向导中以加入类的方式找到控件DLL文件加入到工程中,出现了
    两个类和相关的事件(与说明书相同)其中Connect_Net(LPCTSTR IPAdd, long Port)
    函数是一个用于连接设备的接口函数,我调用到我个函数跟踪到如下的函数体:
    BOOL IZKEM::Connect_Net(LPCTSTR IPAdd, long Port)
    {
    BOOL result;
     BYTE parms[] =VTS_BSTR VTS_I4;
    //A
    InvokeHelper(0x27, DISPATCH_METHOD, VT_BOOL, (BOOL*)&result, parms,IPAdd,          Port);
    return result;
    }
    A处函数没有起作用result值一直不变,连不连指纹机都没有变化.
    应该还是DLL文件的加载出了问题.....大家给点提示吧(啥条件尽管说)
    都快一周了......头痛中!
      

  17.   

    问题终于在2007年4月13日13点29分搞定了!
    感谢CSDN里各们高人的帮助.......谢谢.
    现将解决过程简述如下,希望能给像我一样初学者带来一点帮助:1.把所有的.DLL文件丢到SYSTEM32下.
    2.通过运行regvr32 keeper.dll(一个activex控件)注册控件.
    3.vs2003vc++下建一下基于DIALG的工程.
    4.通过工程-->加入新类-->activex mfc类-->文件-->system32下找到
      keeper.dll文件-->ok
    5.在对话框中右键加入ACTIVEA控件找到keeper object加入(加入后是一个图标
    有属性无事件).
    6.鼠标放在图标处右键加入变量dlg(关键的一步).-->ok
        
           到此整个过程结束,在你用到的地方能过dlg.function()即可自如的调用接口
    函数,没有用过易都亦难夷!      无私助人是一种高尚的品格! 谢过各位接分!
      

  18.   

    vc6里其实是一样的.
    在窗体里加上控件,然后ctrl+w在成员变量页中双击你的控件ID号,自动会给你添加控件类,还有控件类的成员变量
      

  19.   

    我按你的步骤做了!怎么还是不行呀! 
    dlg变量没有Connect_Net方法呀????