Login
`
Templates, Tools and Utilities
|
||
Icetips Article
Back to article list
Search Articles
Add Comment
Printer friendly
Direct link
Windows API: Connecting to NET dll from Clarion 2004-04-08 -- Jim Kane Newsgroups: comp.lang.clarion,softvelocity.clarion.language
> > no, I do it all the time. I just use com but the interfaces are poorly
> > documented so there is a lot of guess work.
>
> I smell a Cmag article cookin':)
Dont know if I'll get arround to that article in this life time so this will
have to do.
in any case, once the .net code in the GAC the steps are:
Steps:
1. Initialize com on computer with .net installed
2. Create a CorRunTimeHost Object and get the ICorRunTimehost interface
3. Call the start method of ICorRunTimeHost to start dot net
4. Call ICorRunTimeHost.GetDefaultDomain to get in Idispatch interface for
the app domain
5. call queryinterface on the IDispatch to get an _AppDomain
6. Call _AppDomain.CreateInstance("msCorlib",
"System.Collections.ArrayList",lpInterface)
where the class and dll is in the gac. The returns an _ObjectHandle
interface
7. you call the unwrap method on Object handle to get an interface pointer
for the .net class you want to call.
8. lpInterface is an Idispatch interface for System.Collections.Arraylist so
you can call an method/property in that class.
9. cleanup
10. uninitializecom
The nice thing is none of the code changes except the strings you use in
step 6 so it's pretty reusable. Leave it to microsoft to make it that
convoluted to be able to call the .net code using classes out of clarion mag
is:
This is the actual code:
DotNetStarted=false
stdcom2.initcom(1)
ICorRunTimeHost &= stdcom2.getinterface(address(CLSID:CorRuntimeHost),
address(IID:ICorRuntimeHost))
If ICorRunTimeHost&=NULL then
StdCom2.TakeError('Cannot create an instance of the .NET
runtime.','DotNet prj')
return
end
if StdCom2.TakeHR(ICorRunTimeHost.StartIt(),'Start Runtime') then do
procret Else DotNetStarted=true.
!Message('DotNet is running')
if
stdcom2.takehr(ICorRunTimeHost.GetDefaultDomain(lpInterface),'GetDefaultDoma
in') or ~lpInterface then do procret.
Iunk &= (lpInterface)
if
stdcom2.TakeHR(Iunk.QueryInterface(address(iid:_AppDomain),lpInterface),'QI
for appdomain') then Iunk.release();do procret.
Iunk.release
IAppDomain&=(lpInterface)
if StdCom2.ToBstr('mscorlib',lpbstr1) or
StdCom2.ToBstr('System.Collections.ArrayList',lpbstr2) then do procret.
if
StdCom2.takehr(IAppDomain.CreateInstance(lpbstr1,lpbstr2,lpInterface),'Creat
eInstance') or ~lpInterface then do procret.
StdCom2.strcl.BstrFree(lpbstr1);StdCom2.strcl.BstrFree(lpbstr2)
_ObjectHandle&=(lpInterface)
if StdCom2.takehr(_ObjectHandle.Unwrap(VarObj),'Unwrap') then do procret.
if varobj.vt<>VT_Dispatch then
variantclear(address(varobj))
StdCom2.TakeHR('unvalid dispatch pointer','')
do procret
end
lpInterface=VarObj.value
Today is November 21, 2024, 3:55 am This article has been viewed 35243 times. Google search has resulted in 466 hits on this article since January 25, 2004.
|
|