From: Kevin W. <sw...@wo...> - 2005-08-29 02:54:27
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I'm approaching my tclAppleHelp wrapper project from a different angle--critcl--and I'm running into some difficulties. I want the command to look something like this: ::tclAppleHelp::GotoPage("myappname.html") where "myappname.html" is the ~ name of my help book bundle. Here is my code: #::tclAppleHelp::GotoPage myBookName ::critcl::ccommand GotoPage {{ClientData ip objc objv} { ~ CFBundleRef myApplicationBundle = NULL; ~ CFStringRef myBookName = NULL; ~ OSStatus err = noErr; ~ myApplicationBundle = CFBundleGetMainBundle(); ~ err = AHGotoPage (myBookName, NULL, NULL); ~ if (err != noErr) { ~ Tcl_AppendResult(ip, "Could not load help book: ", OSErrDesc(err), NULL); ~ return TCL_ERROR; ~ } if (err == noErr) { ~ return TCL_OK; } } This compiles fine (I wrap the entire script with namespace eval tclAppleHelp to get the namespace). However, when I try to test it in an application bundle with a command as outline above, I get an error message of -50, which according to Carbon is a paramErr. Can anyone help me debug this? I'm getting close, because the other function I've wrapped (AHRegisterHelpBook) is now working. I have a feeling I'm not getting the args set up correctly, but I'm not sure how to solve this. Thanks! - -- Cheers, Kevin Walzer, PhD WordTech Software http://www.wordtech-software.com sw at wordtech-software.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDEnjaJmdQs+6YVcoRAtQ4AJ0V6kwgiqsqDfKIGEKvOIe4q6tSXwCfcsZe PAbNcN1SOK0eEgUFe0jMQRo= =AI+k -----END PGP SIGNATURE----- |
From: Daniel A. S. <st...@ic...> - 2005-08-29 03:42:00
|
Kevin, On 29/08/2005, at 12:54, Kevin Walzer wrote: > ~ CFBundleRef myApplicationBundle = NULL; > ~ CFStringRef myBookName = NULL; > ~ OSStatus err = noErr; > ~ myApplicationBundle = CFBundleGetMainBundle(); > ~ err = AHGotoPage (myBookName, NULL, NULL); read the docs again, you're not calling AHGotoPage correctly, either bookname or path must be non-NULL, in your case they're both NULL. Also, no need to call CFBundleGetMainBundle() AFAICT, you're not even using the result... /* * AHGotoPage() * * Discussion: * Delivers a request to load a specific text/html file to the Help * Viewer application. * * Parameters: * * bookname: * Optionally, the AppleTitle of an installed Help book. If NULL, * the path parameter must be a full file: URL to the file to be * opened. * * path: * Optionally, one of two types of paths: 1) a URL-style path to a * file that is relative to the main folder of the book supplied * in the bookname parameter, or 2) if bookname is NULL, a full * file: URL to the file to be opened. If this parameter is NULL, * then bookname must not be NULL, and is used to open the Help * Viewer to the main page of Help content for the specified book. * * anchor: * Optionally, the name of anchor tag to scroll to in the newly * opened file. Can be NULL. * Cheers, Daniel -- ** Daniel A. Steffen ** "And now for something completely ** Dept. of Mathematics ** different" Monty Python ** Macquarie University ** <mailto:st...@ma...> ** NSW 2109 Australia ** <http://www.maths.mq.edu.au/~steffen/> |
From: Kevin W. <sw...@wo...> - 2005-08-29 07:19:54
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Daniel, I have tried this two different ways now and while each compiles, each crashes my test application. In the first method, I am using this approach to get the value of myBookName: myBookName = CFBundleGetValueForInfoDictionaryKey(myApplicationBundle, CFSTR("CFBundleHelpBookName")); When I call this procedure in my application, it crashes with this data: Exception: EXC_BREAKPOINT (0x0006) Code[0]: 0x00000001 Code[1]: 0x9289de80 Thread 0 Crashed: 0 com.apple.Foundation 0x9289de80 _NSRaiseError + 264 1 com.apple.Foundation 0x9289dbbc +[NSException raise:format:] + 40 2 com.apple.Foundation 0x92876cec - -[NSObject(NSForwardInvocation) forward::] + 176 3 libobjc.A.dylib 0x909b20d0 _objc_msgForward + 176 4 com.apple.CoreFoundation 0x90731a70 CFStringAppend + 296 5 com.apple.help 0x92f51580 AHGotoPage + 424 In my application, the procedure call is simply ::tclAppleHelp::GotoPage, since the argument my BookName is being read by the library from the application's info.plist file. In the other method, I use this approach to get the value of myBookName: myBookName = Tcl_GetString(objv[1]); Then, in my test application, I set the command as ::tclAppleHelp::GotoPage "VuMan User Help" That produces this crash output: Exception: EXC_BAD_ACCESS (0x0001) Codes: KERN_INVALID_ADDRESS (0x0001) at 0x509bef68 Thread 0 Crashed: 0 <<00000000>> 0xfffeff30 objc_msgSend_rtp + 48 1 com.apple.CoreFoundation 0x907adb24 _CFShowToFile + 52 2 com.apple.help 0x92f51418 AHGotoPage + 64 3 tclAppleHelp.dylib 0x03786854 tcl_GotoPage + 144 (icplusplus.c:28) Appending other arguments, such as "VuMan User Help" 0 0 (to mirror what AHGotoPage expects) yields the same result. In both cases myBookName is initialized as a CFStringRef. Should I file a bug report somewhere, or is there something obvious that I am doing wrong? Or do you need more information before you can say? Cheers, Kevin Walzer, PhD WordTech Software http://www.wordtech-software.com sw at wordtech-software.com Daniel A. Steffen wrote: | Kevin, | | On 29/08/2005, at 12:54, Kevin Walzer wrote: | |> ~ CFBundleRef myApplicationBundle = NULL; |> ~ CFStringRef myBookName = NULL; |> ~ OSStatus err = noErr; |> ~ myApplicationBundle = CFBundleGetMainBundle(); |> ~ err = AHGotoPage (myBookName, NULL, NULL); | | | | read the docs again, you're not calling AHGotoPage correctly, either | bookname or path must be non-NULL, in your case they're both NULL. Also, | no need to call CFBundleGetMainBundle() AFAICT, you're not even using | the result... | | | /* | * AHGotoPage() | * | * Discussion: | * Delivers a request to load a specific text/html file to the Help | * Viewer application. | * | * Parameters: | * | * bookname: | * Optionally, the AppleTitle of an installed Help book. If NULL, | * the path parameter must be a full file: URL to the file to be | * opened. | * | * path: | * Optionally, one of two types of paths: 1) a URL-style path to a | * file that is relative to the main folder of the book supplied | * in the bookname parameter, or 2) if bookname is NULL, a full | * file: URL to the file to be opened. If this parameter is NULL, | * then bookname must not be NULL, and is used to open the Help | * Viewer to the main page of Help content for the specified book. | * | * anchor: | * Optionally, the name of anchor tag to scroll to in the newly | * opened file. Can be NULL. | * | | | | Cheers, | | Daniel | -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDErcQJmdQs+6YVcoRAmWmAJ9c683XdNfRoIonAMTSVT7aD5lKUgCfcZL3 cpfJKHQrLdC1N2/YGq+WaAA= =qcPa -----END PGP SIGNATURE----- |
From: Daniel A. S. <st...@ic...> - 2005-08-29 08:08:24
|
On 29/08/2005, at 17:19, Kevin Walzer wrote: > I have tried this two different ways now and while each compiles, each > crashes my test application. > > Should I file a bug report somewhere, or is there something obvious > that > I am doing wrong? Or do you need more information before you can say? these don't look like bugs but rather like errors on your part (certainly the first is simply Foundation bailing out on an exception), but without seeing all your code it's hard to tell exactly, could you post your complete critcl code for ::tclAppleHelp::GotoPage ? Cheers, Daniel -- ** Daniel A. Steffen ** "And now for something completely ** Dept. of Mathematics ** different" Monty Python ** Macquarie University ** <mailto:st...@ma...> ** NSW 2109 Australia ** <http://www.maths.mq.edu.au/~steffen/> |
From: Kevin W. <sw...@wo...> - 2005-08-29 12:01:37
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Here's the code. Thanks. ~ ::critcl::ccommand GotoPage {ClientData ip objc objv} { CFStringRef myBookName; OSStatus err = noErr; if (objc != 2) { Tcl_WrongNumArgs(ip, 1, objv, "myBookName"); return TCL_ERROR; ~ } ~ myBookName = Tcl_GetString(objv[1]); err = AHGotoPage (myBookName, NULL, NULL); if (myBookName == NULL) { Tcl_AppendResult(ip, "Could not load help book: ", OSErrDesc(err), NULL); return TCL_ERROR; } if (err != noErr) { Tcl_AppendResult(ip, "Could not load help book: ", OSErrDesc(err), NULL); return TCL_ERROR; } if (err == noErr) { CFRelease(myBookName); return TCL_OK; } ~ } Cheers, Kevin Walzer, PhD WordTech Software http://www.wordtech-software.com sw at wordtech-software.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDEvkVJmdQs+6YVcoRAl37AJkBA1xTwMXI7yWoEzNuHulFs7WbRQCghyNy ItPEVnTzgu9qTyDXJHZfZRA= =X5Bw -----END PGP SIGNATURE----- |
From: Daniel A. S. <st...@ic...> - 2005-08-29 13:38:40
|
Kevin, On 29/08/2005, at 22:01, Kevin Walzer wrote: > CFStringRef myBookName; > ~ myBookName = Tcl_GetString(objv[1]); tcl does not know anything about CFString, Tcl_GetString just returns a simple C string, you have to use CFStringCreateWithCString() to create a CFString from it: myBookName = CFStringCreateWithCString(NULL, Tcl_GetString(objv[1]), kCFStringEncodingUTF8); make sure you CFRelease the CFString when you're done with it. see the CoreFoundation docs for more details Cheers, Daniel -- ** Daniel A. Steffen ** "And now for something completely ** Dept. of Mathematics ** different" Monty Python ** Macquarie University ** <mailto:st...@ma...> ** NSW 2109 Australia ** <http://www.maths.mq.edu.au/~steffen/> |
From: Kevin W. <sw...@wo...> - 2005-08-29 14:46:01
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Daniel, Looks like that did the trick! My application now correctly loads the helpfiles with this command: ::tclAppleHelp::GotoPage "VuMan User Help" Thank you for pointing me in the right direction. I can now ditch Python ~ calls (exec -c python "from Carbon import AH; AH.GotoPage('foo,' None, None)". Using the native help system is important to me, as it enhances the general "user experience" and provides built-in help search for my apps, among other benefits. I'm going to work on implementing one or two more parts of the Carbon Help API, and then when I'm confident everything works, will set up a project at Sourceforge with the library and source code available under a BSD-style license. What would I need to do to have this considered for inclusion in the BI distribution? Cheers, Kevin Walzer, PhD WordTech Software http://www.wordtech-software.com sw at wordtech-software.com Daniel A. Steffen wrote: | Kevin, | | On 29/08/2005, at 22:01, Kevin Walzer wrote: | |> CFStringRef myBookName; | | |> ~ myBookName = Tcl_GetString(objv[1]); | | | tcl does not know anything about CFString, Tcl_GetString just returns a | simple C string, you have to use CFStringCreateWithCString() to create a | CFString from it: | | myBookName = CFStringCreateWithCString(NULL, Tcl_GetString(objv[1]), | kCFStringEncodingUTF8); | | make sure you CFRelease the CFString when you're done with it. | | see the CoreFoundation docs for more details | | Cheers, | | Daniel | -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (Darwin) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDEx+cJmdQs+6YVcoRAprMAJ9JQH0uI9i+/ps3V+r8m7qYa/AuNwCfVMSm pxr6mYZ4zazcuG+XmDhlSqA= =4RvT -----END PGP SIGNATURE----- |