PureBytes Links
Trading Reference Links
|
Tomasz,
I am reporting back on my success as far as it goes on this challenge,
and request another hint. I have succeeded in learning how to write a
C++ DLL function with freely available programs and documentation.
The DLL can get the scroll position of the top child window of the
foreground window and return the result to AFL. I have also written a
function that will set the scroll position to a value specified from
AFL and return the old position as I originally set out to do. This
should give me the ability to get or set the scroll position on any
AmiBroker program window that is active and has a vertical scroll
bar. For instance, with this DLL, I can now get and set the scroll
position on the Formula Editor Window just as expected. However, the
Parameters Window returns an error that it contains no scroll bar even
though it is visible on the screen, so I have not succeeded yet in the
original challenge.
Since you wrote the code that created the (I am assuming) child window
with the scrollbar in the Parameters Window, I have to ask you the
next question. Is there a key concept that I am missing regarding how
to get the handle to the Parameters Window child control/window with
the scroll bar?
I have looked everywhere I know to look for the answer, but have come
up blank. The only possibility I can think of is you wrote this child
window in a custom way that does not support the functions I used to
get or set the scroll. The class string does have a strange looking
name for this window.
Here is the Function.cpp code segment I wrote that gets the scroll
position (or the error code):
// GetWindowScroll( )
// This function returns the vertical scroll position
// of the top window of the foreground (active) window
// Returns zero if not successful
// Temp Debug: Returns the error code if not successful
AmiVar VGetWindowScroll( int NumArgs, AmiVar *ArgsTable )
{
AmiVar OldScroll;
OldScroll.type = VAR_FLOAT;
HWND foreWindow = GetForegroundWindow();
HWND topWindow = GetTopWindow(foreWindow);
int OVWScroll = GetScrollPos( topWindow, SB_VERT );
OldScroll.val = OVWScroll;
if(OVWScroll==0){DWORD dw = GetLastError(); OldScroll.val = dw;} ;//
Debug code
return OldScroll;
}
If there is something that you do not want to reveal publicly on the
forum, please PM me. Otherwise, please another hint.
Best regards,
Dennis
On Apr 27, 2008, at 1:24 PM, Dennis Brown wrote:
> Dan,
>
> LOL --the blind leading the blind. I wanted to relate my experiences
> in attempting this "Impossible for my level of experience and tools"
> solution to my problem to encourage others that it can be done. I
> also knew I would need a little help from a knowledgeable person like
> TJ to point me in the right direction. After all, it would be
> foolish to attempt to do something if there was no reasonable solution
> at all, and he would know. I searched on the internet to fill in more
> details. We don't always have to have the solutions handed to us on a
> silver platter --as nice as that is. I also did not believe that I
> should have to spend a long time with books, manuals, or buy tools
> just to make a 10 line program that I needed now. Besides I learn
> better by discovering things than reading about them in books. The
> little light bulbs go on quite often when I have to work for the
> understanding.
>
> Since I don't know C++ , every line I write has errors. I just try
> different possibilities and recompile until I hit on a syntax that
> works. It usually takes 3-5 attempts to get each line to work, then I
> go to the next line. If I don't get the result I expect, I try
> different experiments, and by the process of elimination I learn what
> is going on. If I get really stuck, I will ask for help again.
> Trial and error engineering!
>
> I still don't have the solution I want working. I wrote the DLL as I
> had envisioned it, and it does work as far as I can tell. However, I
> believe I am missing a key concept about which window in the
> "Parameters Window" contains the scroll bar since I get an error
> message that the foreground window has no scroll bars. I am now
> guessing that the tabbed window structure is such that there is a
> child window overlaid on the main Parameters window that has the
> scroll bar. Now I have to figure out how to get its handle. Notice
> all those Windows type concepts I am throwing around after only a day
> of poking at the problem --LOL.
>
> During some of my internet searches, I did come across some references
> to VB that would lead me to think that I might be able to solve this
> problem with it also. However, I know no more about VB than I do
> about C++, so I might as well do it at the lowest level for the simple
> problem that it is. At least C++ and AFL look enough alike that I can
> guess at the syntax of C++.
>
> Getting frustrated and giving up is something I got over many decades
> ago after realizing that the only way to fail is to give up, and the
> way to succeed is to never give up. Once you determine that you will
> succeed no matter what it takes, the setbacks are just part of
> learning about the solution. It does irk me though when I am given
> wrong information that takes me far in the wrong direction and wastes
> a lot of time.
>
> As far as the typo in the example goes, I don't think TJ needs to say
> anything about it on the board. If nobody noticed it for 7 years, it
> is not critical to get fixed on a moments notice. I would not have
> mentioned it publicly except that it made a good story.
>
> Best regards,
> Dennis
>
> On Apr 27, 2008, at 9:30 AM, ab319320 wrote:
>> Dennis good work. There are two possibilities for the error in the
>> example. I have to wonder if Tomasz even picked up on the error you
>> mentioned as he was caught up in compiler talk and did not thank you
>> and say that the error would be fixed. That aside Tomasz has done a
>> terrific job on MY AMI.
>>
>> But, errors in examples as in a 21 day vc++ book frustrated me to the
>> point that my vc++6.0 pro ed just sets on the shelf. We all have
>> different levels of tolerance and Dennis yours excels.
>>
>> I discovered MS's Express series just a month ago and typed my 1981
>> basic program into vbasic 2008 express. I had over a hundred error
>> msgs but it was easy to work through. I think the vb is easier than
>> the vc express because of the error window (which is more like
>> vc6.0). MS has provided a powerful on-line help enter-face. Vb
>> express, I think, allows creation of a dll.
>>
>> Dennis I hope that you will post a "How To dll" in the Files section
>> which is user friendly. It appears you may have that ability.
>> Sometimes experienced people write over the heads of less
>> experienced.
>> Dan
>> --- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx>
>> wrote:
>>>
>>> Dennis,
>>>
>>> OK, OK, my bad. You see my previous comment was not intended to be
>> taken so seriously.
>>> I have very different perspective than you and others on the list
>>> since C++ compiler is my everyday bread and butter so I have very
>> different expectations and very different opinion than majority.
>>> If I wrote so on some "hard core C geek" forum, I would be
>> understood better.
>>>
>>> Apparently 2008 "express" version is less restrictive
>>> compared to previous 2005. I am not using 2008. Three years ago I
>> bought Professional Edition 2005 to find that I use
>>> it only for 64 bit compilations because it is slow for everyday
>> work, crashes a lot and code produced is not compatible with 9x
>> windows.
>>> I use good old version 6 (from 1997 afair) because it is fast and
>> compatible with all Windows versions. That old version 6.0 is
>>> something that Microsoft has done very well (but there was no free
>> editions at that time).
>>>
>>> Best regards,
>>> Tomasz Janeczko
>>> amibroker.com
>>> ----- Original Message -----
>>> From: Dennis Brown
>>> To: amibroker@xxxxxxxxxxxxxxx
>>> Sent: Saturday, April 26, 2008 7:20 PM
>>> Subject: Re: [amibroker] Visual C++ 2008 Express simple DLL
>> sample file?
>>>
>>>
>>> Tomasz,
>>>
>>>
>>> While, being a Mac guy, I am quick to vilify Microsoft. However,
>> in this case you are being too harsh on them. They seem to have
>> improved their free version for 2008 and with some more
>> experimentation, I was able to get the free version to compile the
>> ADK Sample project and produce the sample.dll. Then I modified the
>> functions.cpp slightly and made another sample.dll that functioned
>> properly with AFL calls.
>>> Here is what I did to make it work:
>>>
>>>
>>> 1. I reinstalled the ADK from scratch to get rid of my previous
>> experiments.
>>> 2. I double clicked the Sample.dsp file which launched Visual
>> C++ 2008 Express Edition
>>> 3. A dialog box came up requesting to convert the project
>> format to an updated version --I clicked Yes. This was the key step.
>>> 4. I did a "Build Solution" from the Build menu.
>>> 5. The Sample.dll was generated error free and placed in
>> the "Debug" folder.
>>> 6. I moved the Sample.dll into the Plugins folder and started
>> up AmiBroker. I added a plot calling ExampleEMA. Success.
>>>
>>>
>>> There is a humorous side to this story also...
>>>
>>>
>>> I modified the ExampleEMA just to make sure that it was my
>> changes that I was seeing and not something else, since the
>> ExampleEMA was a prebuilt function. I called it myExampleEMA, and I
>> changed the function to return a constant. It worked half way????
>> The name changed, but it returned the exact same moving average
>> result as before.
>>>
>>>
>>> I tried all kinds of changes to that function which seemed to
>> have no effect. I finally commented practically everything out in
>> the function and it still returned a beautiful moving average. My
>> mind was going in circles tying to figure out how my changes could be
>> ignored. It truly seemed impossible. It is funny that when you
>> don't know what you are doing and in a new situation, the mind is
>> open to the wildest speculations to explain what is happening.
>>>
>>>
>>> Eventually, I commented out the other two functions: exampleMACD
>> and ExampleMA. Finally I got a compile error message. It turns out
>> that there is a typo in the function table. Both ExampleEMA and
>> ExampleMA point to VExampleMA code. Since the file was last modified
>> in 2001, it must have been there for 7 years and nobody noticed until
>> now --or at least did not bother tell AmiBroker about it. It was
>> lurking for all those years just waiting for a novice like me to get
>> tricked into thinking the laws of programming physics were suddenly
>> altered. LOL
>>>
>>>
>>> Now I will proceed to try and make my real dll work.
>>>
>>>
>>> Best regards,
>>> Dennis
>>>
>>>
>>> On Apr 26, 2008, at 10:22 AM, Tomasz Janeczko wrote:
>>>
>>> See also the video:
>>> http://www.amibroker.com/video/devcpp.html
>>>
>>> Best regards,
>>> Tomasz Janeczko
>>> amibroker.com
>>> ----- Original Message -----
>>> From: Tomasz Janeczko
>>> To: amibroker@xxxxxxxxxxxxxxx
>>> Sent: Saturday, April 26, 2008 4:19 PM
>>> Subject: Re: [amibroker] Visual C++ 2008 Express simple DLL
>> sample file?
>>>
>>>
>>> Hello,
>>>
>>> Visual C++ 2008 EXPRESS edition (FREE) is severely limited
>> and does NOT support creating of DLLs at all.
>>> That's why you get error when compiling it with Express
>> edition.
>>> Microsoft never gives useful things for free. Express
>> editions are toys only.
>>>
>>> To create DLLs you need either Standard or Professional
>> edition, or free Borland compiler or free GCC( GNU CC)/MinGW
>>> http://www.bloodshed.net/devcpp.html
>>> Sample project files for free Dec-C++ are included in the ADK.
>>>
>>> Best regards,
>>> Tomasz Janeczko
>>> amibroker.com
>>> ----- Original Message -----
>>> From: Dennis Brown
>>> To: amibroker@xxxxxxxxxxxxxxx
>>> Sent: Saturday, April 26, 2008 2:18 PM
>>> Subject: Re: [amibroker] Visual C++ 2008 Express simple DLL
>> sample file?
>>>
>>>
>>> Paul, That is exactly what my plan was and what I was
>> attempting to do. However, the example in the ADK would not compile
>> error free with Visual C++ 2008 Express as I explained. Perhaps it
>> would with the full version, but I explained that issue in my last
>> post to Mike.
>>>
>>>
>>> BR,
>>> Dennis
>>>
>>>
>>> On Apr 26, 2008, at 2:13 AM, Paul Ho wrote:
>>>
>>> You should start off by compiling the examples contained
>> in the ADK. and increment things slowly so you know what could
>> possibly cause the problem
>>>
>>>
>>>
>>>
>>> --------------------------------------------------------------------
>>> From: amibroker@xxxxxxxxxxxxxxx
>> [mailto:amibroker@xxxxxxxxxxxxxxx] On Behalf Of Dennis Brown
>>> Sent: Saturday, 26 April 2008 1:44 PM
>>> To: amibroker@xxxxxxxxxxxxxxx
>>> Subject: [amibroker] Visual C++ 2008 Express simple DLL
>> sample file?
>>>
>>>
>>> Hello,
>>>
>>> I took the challenge from Tomasz that anyone who is
>> willing to learn,
>>> can extend AFL to do anything. My chosen task is to
>> restore the
>>> scroll position of the Parameters Window after a "Reset
>> all" button
>>> click --and yes, it has an important use.
>>>
>>> Tomasz informed me that I would need to write a DLL to
>> make this
>>> possible. There may be other ways, but I will try it
>> this way.
>>>
>>> First I have to say that I do not know C++ (other than
>> AFL has a
>>> similar syntax). Next I am not very familiar with
>> anything Windows (I
>>> am a Mac guy). So if I can do this (with a little help
>> from my AB
>>> friends) Tomasz will be vindicated in his statements.
>>>
>>> I determined that all I need is to make an extremely
>> simple DLL. It
>>> will create the following new AFL function:
>>>
>>> oldScrollPosition = GetSetWindowScroll
>> (newScrollPosition);
>>>
>>> It will simply return the current scroll position of
>> the active
>>> foreground window and then set the scroll position to
>> the supplied
>>> parameter. It should only be about 10 lines of C++ code.
>>>
>>> I have found the Windows calls that will get the handle
>> of the
>>> foreground window, and (with a pointer from Tomasz)
>> calls to get and
>>> set the scroll thumb position on a standard window.
>>>
>>> Everything else I need to do I can handle with AutoIt
>> or AFL.
>>>
>>> I have installed the free ADK and installed the free
>> Visual C++ 2008
>>> Express program, and started to try to write this.
>>>
>>> Initially I tried just Building the Sample DLL in the
>> ADK. That
>>> mostly works, but gives me errors on the Plugin.cpp:
>>>
>>> error C2491: on 5 critical lines for : Definition of
>> dllimport
>>> function not allowed
>>> these are the PLUGINAPI statements for Release, Init,
>>> GetFunnctionTable, SetSiteInterface, and GetPluginInfo.
>>>
>>> Somehow, I think I really need these lines to compile
>> for any AB DLL
>>> to work...
>>>
>>> I have tried a bunch of things, and I can make it give
>> me more errors,
>>> but unfortunately no less errors. So I think I need
>> some hints or
>>> more help to get started.
>>>
>>> I was wondering if anyone has an answer, or a simple
>> DLL sample
>>> project file that builds error free on Visual C++ 2008
>> Express that
>>> you could email me to get me started on the right track
>> with this?
>>>
>>> Thanks,
>>> Dennis
>>>
>>
>>
>>
>> ------------------------------------
>>
>> Please note that this group is for discussion between users only.
>>
>> To get support from AmiBroker please send an e-mail directly to
>> SUPPORT {at} amibroker.com
>>
>> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
>> http://www.amibroker.com/devlog/
>>
>> For other support material please check also:
>> http://www.amibroker.com/support.html
>> Yahoo! Groups Links
>>
>>
>>
>
>
> ------------------------------------
>
> Please note that this group is for discussion between users only.
>
> To get support from AmiBroker please send an e-mail directly to
> SUPPORT {at} amibroker.com
>
> For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
> http://www.amibroker.com/devlog/
>
> For other support material please check also:
> http://www.amibroker.com/support.html
> Yahoo! Groups Links
>
>
>
------------------------------------
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links
<*> To visit your group on the web, go to:
http://groups.yahoo.com/group/amibroker/
<*> Your email settings:
Individual Email | Traditional
<*> To change settings online go to:
http://groups.yahoo.com/group/amibroker/join
(Yahoo! ID required)
<*> To change settings via email:
mailto:amibroker-digest@xxxxxxxxxxxxxxx
mailto:amibroker-fullfeatured@xxxxxxxxxxxxxxx
<*> To unsubscribe from this group, send an email to:
amibroker-unsubscribe@xxxxxxxxxxxxxxx
<*> Your use of Yahoo! Groups is subject to:
http://docs.yahoo.com/info/terms/
|