|
CoInitializeEx requires either NT 4.x or greater or Win 98 (Win 95 with DCOM).
Try either #define _WIN32_DCOM or #define WIN32_WINNT 0x0400.
Michael
|
|
|
|
|
If you are using ATL, in your Stdafx.h
make sure sure have before all includes
#define STRICT
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#define _ATL_FREE_THREADED //_ATL_APARTMENT_THREADED
Make sure your WinMain look like this, you need CLSCTX_LOCAL_SERVER
if you are using a local server.
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE , LPTSTR lpCmdLine, int )
{
lpCmdLine = GetCommandLine();
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
HRESULT hRes = CoInitialize(NULL);
#endif
if (bRun)
{
_Module.StartMonitor();
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
_ASSERTE(SUCCEEDED(hRes));
hRes = CoResumeClassObjects();
#else
hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE);
#endif
_ASSERTE(SUCCEEDED(hRes));
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
_Module.RevokeClassObjects();
Sleep(dwPause);
}
_Module.Term();
CoUninitialize();
return nRet;
}
|
|
|
|
|
Sweet guys! that definitely fixed it.
Now on to our next question... (the next thread)
SHABBA!!
|
|
|
|
|
er... we'll do it right here...
ok... It goes through all of the many events raised, and then when it gets to the last one, it'll crash. hmm... it crashes in COleDispatchDriver::InvokeHelperV 's call to
COleDispatchDriver::Invoke... then it goes into assembly.(grr)
(it's referencing something with nothing in it (0x000005)
Has anyone had an error similar to that?
I'm pretty darn sure i'm not wiping anything out before that last event finishes... i really need this last event too...<sigh>
I hope you guys have had this happen to you as well, and just so you know, the events are sent to a VB app... i'm sure y'all knew that though. Not as much stress on me now, but it's still lingering...
Help!! Thanks, people! Learnin' from the best I guess!
~Tim
SHABBA!!
|
|
|
|
|
Happy to know that you finally made it!
The only reason I can see is that you are calling that function with
invalid arguments (why the other event function crash?)
If you were using an old client with VB, you may need to rebuild your
VB client.
Give a sample of your code, people will help you faster!
|
|
|
|
|
ok here comes the sample:
I have my MFC ActiveX Full Control (according to VC++ 6.0 Wizard).
//Which Calls:
CESpyderCtl::Start() {
//oh, and i call CoInitializeEx(NULL, COINIT_MULTITHREADED)
// in CESpyderApp::InitInstance() also, but i dont know what runs first...
// havent tried to find out. *shrug*
_beginthread(...)
//err checking
}
//Begin Thread Calls a global function called:
void gStart(void *spy) {
//which ultimately calls Parse() that fires an event pretty often
//so it can update a color box to show what it's doing.
CoInitializeEx(NULL, COINIT_MULTITHREADED); //i call this in
//CESpyderApp::InitInstance() as well.
Parse();
CoInitializeEx(NULL, COINIT_MULTITHREADED);
}
//So inside of Parse(); we've got this
int CESpyder::Parse() {
//parse a file
Fire_StatusChange(STAT_SEARCHING); //events are status changes
//connecting, adding, searching, error, and done.
//and on the last one, it's doing the same thing, and i'm firing a done event.
Fire_StatusChange(STAT_DONE);
//i also fire a separate done event, but it never gets to it, and i've also tried to just fire a done event, but it crashes the same way.
Fire_Done();
return 1;
}
I figure this still wont give you enough information, i've tried putting
Sleep()'s all over the place.., but it seems like it doesnt affect it...
<sigh>, i'm using apartment threading, if i remember correctly it wont let me pick apartment or free threaded. i think i even tried doing ATL but free was greyed out... either way i dont know how to Fire events in VC with an ATL object... (you could show me that, but i'll never be able to get rid of this thing that will eat at my soul for eternity... haha!
Thanks,
~Tim
SHABBA!!
|
|
|
|
|
Sorry if I can't help you. All I can tell you is your bug
is maybe related to MFC. I always use ATL to develop ActiveX control.
I know MFC has a macro, I think it's: AFX_MANAGE_STATE( ), where I have
seen developer using: AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
but again I have never use it. Do you always fire event from the same thread?
What's the other thread is doing?
|
|
|
|
|
i tried throwing that in there to no avail, but i went and searched for firing events from worker threads with AFX_MANAGE_STATE in there as well and found some stuff, so i'm working on trying one of those out right at this moment..
do you think you could show me how to raise an event from C++ using an ATL control ? (for kicks i can try it through ATL and see how well it works then)
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
Okay I will send you an example how I did something similar.
|
|
|
|
|
I made a simple demo for you. I sent it to your email at:
heaven_bounty@yahoo.com
Let me know if it helps you!
|
|
|
|
|
That's what baffles me is that it's the exact same idea except that it's in an MFC ActiveX Control...
here's my question:
1. Make a new COM ATL Project.
-I picked FULL CONTROL when i made a new ATL obj... I assume that to be fine.
-Do i want to merge proxy/stub code?
-Support Connection points, of course
-Apartment threading (it wont let you choose Free if you choose to make a
control) so... should i just be making an ATL object and wrap it in a Control?
-Do i need to check free threaded marshalling?(i assumed so)
-Aggregation: (No) i have no clue what this does... i've basically learned COM/ATL/ActiveX from common lingo and trial and error.
2. ok after all of that is done, (the real question is coming, i promise)
- I compile,
- Implement Connection points? I cannot compile to where i can call events in the code and it doesnt show up (like the way you have it in CProxy...).
that's my dilemma. oh and when i try to add a function to the CProxy_... i get: "The implementation file for class CProxy_ITesterEvents<class t=""> cannot be found" ---- what am i not doing, that i should be doing??
well, that's all for now, i'm gonna keep messing with it. RSVP
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
1) Make a new COM ATL Project [ ok ]
- Picked Full .. [ ok ]
- Attributes: Apartment, Dual, Aggregation: Yes [or No] doesn't matter for now
- Connection points [x], Error Info [ ] (no, or I don't mind), Free Thread [ ] (no, I don't
mind, that's not the cause of your problem).
- Select settings for Miscellaneous, Stock Properties [ ok ]
2) Build your project, It should build fine (very important, must work)
3) Add event function to your connection point, right-click "_YourObjectEvents" and select
Add Method ( I am sure you did everything correctly so far...)
4) Verify that you have COM_INTERFACE_ENTRY(IConnectionPointContainer) in your COM_MAP
5) Implement the connection point:
- right-click your "YourObjectClass", chose "Implement Connection Point..."
- check your "_YourObjectEvents" and Click Ok
6) At that point, the proxy stub will be added for you, if you don't see it. You must have
it already on your folder. You may want to delete previous proxy stub class (files) every
time you add a new method (event) to your connection point.
7) Follow the example in the thread function that I sent you.
|
|
|
|
|
cool, ok that's what i've been doing. now after i implement the connection points i get an error:
BEGIN_CONNECTION_POINT_MAP(Ccrap)
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
CONNECTION_POINT_ENTRY(IID__IcrapEvents)
END_CONNECTION_POINT_MAP()
it says that IID_IcrapEvents is undeclared... any clue about that?
also, when it asked me if i wanted a .dll or exe it also had a Checkbox that asked if you wanted to merge proxy/stub code. Is that necessary?
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
MasterWang wrote:
it says that IID_IcrapEvents is undeclared... any clue about that?
You mean DIID_IcrapEvents
MasterWang wrote:
also, when it asked me if i wanted a .dll or exe it also had a Checkbox that asked if you wanted to merge proxy/stub code. Is that necessary?
No!
|
|
|
|
|
oh! wow, there's that error that i told you before, but yes "Fire_Done()" is there though (woohoo!).
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
and it gives it to me as IID_Iklfasjdf, not DIID_afklj;ds
but when i changed it to DIID, we have no errors. i'm sure i'll post something shortly here on my status.
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
that DIID_YOUROBJECTEvent is defined in "YourObject_i.c".
This is an auto-created file.
Glad to see you get there!
|
|
|
|
|
ok ok, good news/bad news... the good news is that it compiles and fires the events, bad news is that it still crashes...
i'm calling CoInitializeEx() and CoUninit
at the beginning/end of the worker thread,
still testin' and messin' with it.
anything that i forgot about that i should for sure have in there?..
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
All I can do to help you is:
Ask you to test your control in the "ActiveX Control container Test" program.
If it works, look for what you are doing wrong in your client!
By the way, always use the same thread to access your object, ie: do not
access your object from the event handler!
Good luck
|
|
|
|
|
hahahahaha!!!!!!!!! woo hoooooooooooo!!!!!!!!!!!!!!!!!!!!!
yaaaaaaaaaaaaaaaaaaaaaaa-hooooooooooooooooooooooooooooo!!!!!!!!!!!!!!!
oh, hey, it works or whatever.
(trying to keep straight face )
yeah!!!! i think i know why it was botching up when we had identical code.
-When i added the first event to the project, i didnt compile afterwards and i think that's why that IID -> DIID wasnt working properly, and that's why it had never worked. so i just slowly did one thing at a time compiling after i did something else. and it works now! yeah!!!!!
Cool, thanks for being patient with all 4,000 threads in the forum and all!
woooooooooooo hooooooooooooooo!!!!!!!!!!!!!!
Ok there's the One and only God, then there's you! wooooooooo hooooooo!!!
thanks again!!!!! yeah!!!!!!!!!!!!!
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
Nice to see that you believe in the ONLY God.
I am happy for you!
Merry Christmas & Happy new year!
- God bless the World
|
|
|
|
|
haha - well it's nice to know that i'm not the only one now in this field!
~Timothy T. Rymer
www.digipen.edu
tim.xpertz.com
|
|
|
|
|
How the interfaces are internaly designed,what is the exact role of Interface?
Terminater
|
|
|
|
|
Which interfaces?
Are you talking about IUnknown and IDispatch?
Michael
|
|
|
|
|
Hey guys and gals,
I've read some things on MSDN about trying to fire events from an ActiveX Control written in VC++ 6.0, but i just cant seem to get it. Is there any way to raise an event and get it to the main program from a worker thread? Is there any way you can explain this so that i can "comprehend" it? Can i just get some basics on how to do it? and if you do something strange, try to explain it.. (like any MFC Macro stuff cuz i really never use MFC if i dont have to) just do it in steps! 1.2.3.4.5.! <sigh> I'd love to hear a different insight on all of this... it's been bugging me for about a month, and i've been able to work around it, and now it's time to fix it.
SHABBA!!
|
|
|
|