Solved

data conversion error when assigning function to function pointer

Posted on 2007-03-21
7
780 Views
Last Modified: 2013-12-08
Hi Experts,
    I am trying to assign a function to a function pointer member in CFactoryTemplate, which is a class from directshow SDK

this is the class that i wrote:
class CMYFilter: public CTransInPlaceFilter
{
    public:
        CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr);
};

What i am trying to do is assign CreateInstance to a member of type
LPFNNewCOMObject
which has its original declaration as
typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);

the assignment is shown here:
CFactoryTemplate g_Templates[1] =
{
  {
    g_wszName,
    &CLSID_CMYFilter,
    CMYFilter::CreateInstance,  // line with error
    NULL,
    NULL
  }
};

I kept receiving this error message at the line CMYFilter::CreateInstance.

error C2440: 'initializing' : cannot convert from 'CUnknown *(__cdecl
CMYFilter::* )(LPUNKNOWN,HRESULT *)' to 'LPFNNewCOMObject'
1>        None of the functions with this name in scope match the target type

This is very strange since all the sample codes, including those came with
SDK, were written like this.

Is there any reason why this is happening?
thanks!
0
Comment
Question by:fungi8210
  • 5
  • 2
7 Comments
 
LVL 86

Accepted Solution

by:
jkr earned 500 total points
ID: 18766235
You need to make that function a 'static' member of your class - non static ones are passed an invisible 'this' pointer which makes the signature different, thus the error.

class CMYFilter: public CTransInPlaceFilter
{
    public:
        static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr);
};

will get that to work.
0
 
LVL 86

Expert Comment

by:jkr
ID: 18766237
BTW, a factory function also does not need to be a non-static member.
0
 

Author Comment

by:fungi8210
ID: 18766258
i just added static to it, now i am getting these errors
error LNK2001: unresolved external symbol "public: static class CUnknown * __cdecl CFPSFilter::CreateInstance(struct IUnknown *,long *)" (?CreateInstance@CFPSFilter@@SAPAVCUnknown@@PAUIUnknown@@PAJ@Z)

error LNK2001: unresolved external symbol CLSID_FPSFilter
1>Windows Mobile 6 Professional SDK (ARMV4I)\Debug/MyFilter.dll : fatal error LNK1120: 2 unresolved externals

just incase you are wondering, i'm trying to write a directshow filter, and CLSID_FPSFilter is my classid defined at the top

// {033104B2-2AA9-4476-992E-AB504F9F1F1E}
DEFINE_GUID(CLSID_FPSFilter,
0x33104b2, 0x2aa9, 0x4476, 0x99, 0x2e, 0xab, 0x50, 0x4f, 0x9f, 0x1f, 0x1e);

btw, you answered my question correctly, you'll get the points, just wondering if you know how to solve my second problem, thanks!
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
LVL 86

Expert Comment

by:jkr
ID: 18766283
You'll need to provide an implementation also, e.g.

static CUnknown * WINAPI CMYFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) {

  CMYFilter* p = NULL;

  // other code to create a 'CMYFilter' here...

  return p;
}

0
 
LVL 86

Expert Comment

by:jkr
ID: 18766293
Sorry, that should have been

CUnknown * WINAPI CMYFilter::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr) {

  CMYFilter* p = NULL;

  // other code to create a 'CMYFilter' here...

  return (CUnknown*) p;
}
0
 

Author Comment

by:fungi8210
ID: 18766319
thanks, one last error

CMYFilter.obj : error LNK2001: unresolved external symbol CLSID_CMYFilter
1>Windows Mobile 6 Professional SDK (ARMV4I)\Debug/MyFilter.dll : fatal error LNK1120: 1 unresolved externals

its weird because i defined CLSID_CMYFilter at the top


// {033104B2-2AA9-4476-992E-AB504F9F1F1E}
DEFINE_GUID(CLSID_CMYFilter,
0x33104b2, 0x2aa9, 0x4476, 0x99, 0x2e, 0xab, 0x50, 0x4f, 0x9f, 0x1f, 0x1e);

0
 
LVL 86

Expert Comment

by:jkr
ID: 18766368
>>its weird because i defined CLSID_CMYFilter at the top

Yes, but for that to be expanded to also an implementation (not just a declaration) you'll need to

#define INITGUID

before

#include <objbase.h>
0

Featured Post

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
What is RenderMan: RenderMan is a not any particular piece of software. RenderMan is an industry standard, defining set of rules that any rendering software should use, to be RenderMan-compliant. Pixar's RenderMan is a flagship implementation of …
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

791 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question