我做了一个ocx,当中用到第三方2个lib,一个.h文件。假设这个.h中有个ClassA
如果我不声明ClassA m_test,没有问题,但我要用lib中的函数,所以要实例化ClassA,结果出现标题说的问题,请问有人知道,可能是什么原因吗??

解决方案 »

  1.   

    还有个补充就是,我如果在exe中用这个lib,什么问题都没有,为什么在ocx中就出问题亚?? 有人感兴趣,我可以把这个lib发给她试一下!!!
      

  2.   

    你声明的地方不对,在ocx中不能乱声明,因为一个接口对应一个coclass!这就是和一般的exe不一样的地方!
      

  3.   

    我在*Ctrl.h和*Ctrl.cpp甚至在类外面都声明过,都不好用啊,请问正确的声明要在那里写呀?该怎么写??
      

  4.   

    我发现是App实例化时出的错,我把CTestApp NEAR theApp;改成CTestApp NEAR theApp();
    错误没有了,注册也能成功了,但是这个ocx不能被调用,为什么呀??我越来越晕了。高手快看看亚
      

  5.   

    只要你link了lib和加入了include .h,不用声明也可以呀!在exe下能用在ocx里面不可能用不成的!
      

  6.   

    可能我没写清楚,在来一次我用MFC ActiveX ControlWizard做了一个ocx控件,不做任何改动,导入2个lib,include一个.h(第三方的),这时编译,没有错误。然后,声明类实例,假如在那个.h里有一个ClassA,我在任何位置加入ClassA m_A后,再编译,都会在注册时出错(VC每次运行都是自动注册的),出错的位置很怪,是在这个ocx得App文件中,是CTestApp NEAR theApp;出错,如果忽略这个错误去debug,发现theApp是NULL,请问各位大虾,这时怎么回事呀??怎么才能好用??麻烦下一个进来的,帮我up一下,我回3次了,不能再回了,谢谢各位!!
      

  7.   

    发过去了不好意思,两个程序1M左右两个目录下都有lib和h文件,你一定能看出来时哪个谢谢还有要原玛的吗?? 留下信箱,我发过去你们看
    看来明天我的加班了,如果各位明天有空,来帮帮忙呀!!
      

  8.   

    全局变量定义顺序不对,手工调整一下。CTestApp theApp;在初始化就前被引用了。
      

  9.   

    可是 CTestApp NEAR theApp不是我定义的呀,是MFC自己生成的,我根本没都过他并且,如果我把我声明的那个实例CDust m_dust去掉(就是那个lib内的类),就都没问题了,
      

  10.   

    “出错的位置很怪,是在这个ocx得App文件中,是CTestApp NEAR theApp;出错”指明是theApp这个变量的构造函数发生错误。也就是说程序中的某个全局或静态变量的构造函数发生了错误。很可能就是楼主导入的ClassA m_test的构造函数发生问题,楼主请查一下ClassA的构造函数的内容。
      

  11.   

    ClassA中没有构造函数, 只有lib中5个函数的声明。真的是很奇怪,是不是不应该再我的ocx中对类进行实例化呀,还没解决,郁闷ing......
      

  12.   

    以下是哪个.h的内容:
    class CDustBust
    {
    // Operations
    protected: 
    int             m_pixels;
    int             m_lines;
    BOOL            m_bBox;
    CPoint          m_point1, m_point2;
    RECT            m_SubImgRect;
    void LineWalkerPW(float *mask,int x, int y,int pixels, int lines,int xOff, int yOff,int npts,int &cnt1, int &cnt2,int *p1, int *p2, int *p1X,int *p1Y,int *p2X, int *p2Y);
    bool PinWheel_Interpolation(float *mask,float *red, float *grn,float *blu,int pixels,int lines,RECT rectROI);
    public:
    BOOL m_bInit;
    CDustBust();
    ~CDustBust();
    void Initialize(int pixels, int lines); 
    bool ApplyDustBust(float *red, float *grn, float *blu, BOOL bDust);
    RECT GetSubImageRect(CPoint point1, CPoint point2);
    };//以下是我在ocx中的使用部分,这个ocx是用MFC ActiveX Control标准模板作的。没做任何改动。#include "DustBust.h"  
    CDustBust  m_dust;然后编译,debug中,当开始显示注册ocx时,就会弹出一个Error。
      

  13.   

    “全局变量定义顺序不对,手工调整一下。CTestApp theApp;在初始化就前被引用了。”
    我觉得可能是这个原因。你可不可以把那个类的实例作为CTestApp的成员变量呢?
      

  14.   

    谢谢,试过了,这样对马??#include "DustBust.h"  class CLoadOcxApp : public COleControlModule
    {
    CDustBust  m_dust;
    }可还是不行,我的原码很少,很简单,那个lib就3个函数,我调用时就声明一下,各位大虾
    能不能帮我看一下呀。留个mail。
      

  15.   

    再说明一下,那个错误是在register的时候出来的,不是compiling时出错的。
    这个问题解决后,另开贴加200分。如果到24号晚上还没解决,也揭帖另加200分,谢谢大家的到来。
      

  16.   

    楼上的,发一份给我看一下吧,学习一下
    [email protected]
      

  17.   

    发过去了,请查收,谢谢了!!!
    一共3个Foler,LoadLibEXE, 用application调用Lib...........无错误
    LoadLibOCX, 用Ocx调用Lib................error
    EXE, Library和上面两个程序生成的文件
      

  18.   

    我发现EKCNRlib.lib引用到了MFC的静态库MFC42s,当把工程改为链接静态MFC库时,注册时不会断言失败了。所以我怀疑是因为混合使用MFC动态库和静态库,导致一下断言失败
    dllole.cpp Ln 146
    ASSERT(AfxGetModuleState() != AfxGetAppModuleState());至于为什么App不会有断言,我认为只是没有触发,可能只有在使用过程中才会触发那些错误。
      

  19.   

    这个问题需要看一下源码!
    [email protected]
      

  20.   

    楼主有兴趣可以发一份给我
    [email protected]
      

  21.   

    好了,问题解决了, 用easyrock() 说的方法,的确没有问题了,请大家去下面的连接接分, easyrock()一定要去呀。
    http://expert.csdn.net/Expert/topic/2589/2589415.xml?temp=.5052759 和
    http://expert.csdn.net/Expert/topic/2589/2589419.xml?temp=5.967349E-02 接分非常感谢大家,不让我的元旦就过不好了。。问题解决了,不过还是愿意和大家讨论这个问题的原因,如果有兴趣,大家还可以在这3个连接上讨论。再次谢谢大家!!:)