Author | Topic: Crash setproperty | |
---|---|---|
Hector Pezoa | Crash setproperty on Mon, 23 Jul 2018 12:28:33 -0400 I have problems with a property in activex I'm running this code in visual fox pro, and I'm not having any trouble. If I run it on Alaska xbase 1.9 , it doesn't work oParser = CREATEOBJECT("MSXML2.DOMDocument.6.0") //oParser = ActiveXObject():create("MSXML2.DOMDocument.6.0") oParser:Async = .F. oParser:preserveWhiteSpace := ::Op_WhiteSpace oParser:setProperty("ProhibitDTD", .F. ) -----> crash error Alaska xbase++ oParser:validateOnParse := !::Op_DTD oParser:setProperty( "Property", "ProhibitDTD", .F. ) -----> crash error Alaska xbase++ See Jim's message 18/06/2018 ::oMails:setProperty("Folders","Xbase") -> crash You will have solve your problem with alaska xbase++ Xbase does not handle type conversion well BestRegard Hector Pezoa | |
Andreas Gehrs-Pahl | Re: Crash setproperty on Mon, 23 Jul 2018 13:08:52 -0400 Hector, >oParser:setProperty("ProhibitDTD", .F.) -----> crash error Alaska xbase++ >oParser:setProperty("Property", "ProhibitDTD", .F.) -----> crash The "ProhibitDTD" property is a "second level" property, which needs to be set with the Method "setProperty". The Alaska "ActiveXObject" class also includes a method called "setProperty" (which is inherited from the "AutomationObject" class). So you will have to use: oParser:CallMethod("setProperty", "ProhibitDTD", .f.) Hope that helps, Andreas Andreas Gehrs-Pahl Absolute Software, LLC phone: (989) 723-9927 email: Andreas@AbsoluteSoftwareLLC.com web: http://www.AbsoluteSoftwareLLC.com [F]: https://www.facebook.com/AbsoluteSoftwareLLC | |
Hector Pezoa | Re: Crash setproperty on Mon, 23 Jul 2018 13:59:44 -0400 Hi Andreas Grateful for your prompt reply I recognize tha people like you help make great xbase++ But this leaves me busy dialing ??? The "ProhibitDTD" property is a "second level" property, which needs to be set with the Method "setProperty". The Alaska "ActiveXObject" class also includes a method called "setProperty" ???? (which is inherited from the "AutomationObject" class). So you will have to use: > oParser:CallMethod("setProperty", "ProhibitDTD", .f.) > > Hope that helps, Yes, Now Ok Thank you best regard Hector Pezoa <Andreas Gehrs-Pahl> escribi en el mensaje news:1fr6op0t2rkky$.1aijy3w9ppuua.dlg@40tude.net... > Hector, > >>oParser:setProperty("ProhibitDTD", .F.) -----> crash error Alaska >>xbase++ >>oParser:setProperty("Property", "ProhibitDTD", .F.) -----> crash > > The "ProhibitDTD" property is a "second level" property, which needs to be > set with the Method "setProperty". The Alaska "ActiveXObject" class also > includes a method called "setProperty" (which is inherited from the > "AutomationObject" class). So you will have to use: > > oParser:CallMethod("setProperty", "ProhibitDTD", .f.) > > Hope that helps, > > Andreas > -- > Andreas Gehrs-Pahl > Absolute Software, LLC > > phone: (989) 723-9927 > email: Andreas@AbsoluteSoftwareLLC.com > web: http://www.AbsoluteSoftwareLLC.com > [F]: https://www.facebook.com/AbsoluteSoftwareLLC | |
Andreas Gehrs-Pahl | Re: Crash setproperty on Mon, 23 Jul 2018 17:05:13 -0400 Hector, >But this leaves me busy dialing ??? I assume that the above means that my explanation wasn't good enough. So, let me try again: Alaska added the "AutomationObject" and "ActiveXObject" classes to Xbase++ to allow the (relatively) easy implementation of COM/ActiveX components. Like any Xbase++ classes, those two classes have various methods (and properties), such as ":Create()", ":Destroy()", and ":Cargo". They also include several additional low-level methods, including: ":GetProperty()", ":SetProperty()" and ":CallMethod()". When you create an Xbase++ AutomationObject or ActiveXObject, all the Methods and Properties of the COM/ActiveX component are automatically made available to you through the created Xbase++ objects. In your example that includes the ":Async" and ":PreserveWhiteSpace" properties, which you can access directly like this: oParser:Async := .f. oParser:PreserveWhiteSpace := .t. or indirectly, like this: oParser:SetProperty("Async", .f.) oParser:SetProperty("PreserveWhiteSpace", .f.) But when the name of a method (or property) conflicts with an existing method (or property) name of the "AutomationObject" or "ActiveXObject" class, such as a method named ":SetProperty()", then you can't access the COM/ActiveX component's method (or property) directly. In those cases you need to use the low-level methods that were added for that purpose, like ":GetProperty()", ":SetProperty()" and ":CallMethod()". The MSXML ActiveX component has no "ProhibitDTD" property, instead it has a method called "SetProperty" to set several (16) so-called "second level DOM properties", including "ProhibitDTD". For a complete list see: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms766391%28v%3dvs.85%29 Because this "SetProperty" method has the same name as the already existing Xbase++ method, you can't call it directly. Instead, you need to use the Xbase++ method ":CallMethod()", which can be used to access any of the COM/ ActiveX component's methods indirectly, by specifying their name, even if the Xbase++ class has a method with the same name. So, instead of accessing the property directly: oParser:ProhibitDTD := .f. <== Error, as there is no such Property or trying to call the MSXML ActiveX component's method directly: oParser:SetProperty("ProhibitDTD", .f.) <== Error, Xbase Method is called you instead need to call this (hidden) Active-X method indirectly: oParser:CallMethod("SetProperty", "ProhibitDTD", .f.) The same is true for the "GetProperty" method of the MSXML DOM component. If Alaska would have called their method something else, like e.g. "ChangeProperty", or if MS would have called their method something else -- or if MS would have implemented the "ProhibitDTD" property as a normal "first-level DOM Property" (which doesn't require a method call) -- then there wouldn't be a conflict, and you wouldn't have to use ":CallMethod()" to access the MS "SetProperty" method to set the "ProhibitDTD" property value. I hope that explains it sufficiently. Andreas Andreas Gehrs-Pahl Absolute Software, LLC phone: (989) 723-9927 email: Andreas@AbsoluteSoftwareLLC.com web: http://www.AbsoluteSoftwareLLC.com [F]: https://www.facebook.com/AbsoluteSoftwareLLC | |
Jim Lee | Re: Crash setproperty on Mon, 23 Jul 2018 23:00:57 +0200 > oParser:CallMethod("setProperty", "ProhibitDTD", .f.) THX to make it clear btw. how about using Invoke() ? | |
Hector Pezoa | Re: Crash setproperty on Tue, 24 Jul 2018 00:25:49 -0400 Hi Andrea Excellent explanation, excuse me for my bad english. His response was perfect and the error was correct But the answer you gave me earlier It was quite a surprise for me It wasn't in my knowlodge Thank you again Best Regard Hector Pezoa |