if you´ve written the DLL yourself you could use a workaround in the
way:
Change the function your array will be filled to give back the number
of items in the array instead of the array itself. You then can write
a second function to fetch a array item as a string result and use it
to iterate over all items depending on the result of the first
function.
So you will not get any trouble with memory, scope, datatypes and all
these things.
Bernd Linthe
--- In [email protected], "Thomas Jensen" <[EMAIL PROTECTED]>
wrote:
>
> Hi Tim
>
> Well actually as far as I know this is something Windows does...
However I suppose a DLL should be allowed to modify memory by the
application running the DLL, so I don't really understand why it is a
problem.
>
> I don't have time to test/writing examples myself right now, but if
you take a look at the WinApi class you will find lots of examples of
allocation Binary objects and calling DLL functions returning data in
the allocated memory.
>
> I have previously written DLL functions returning string values in
memory allocated by the DLL so that's is certainly also possible.
>
> Regards
> Thomas
>
> -----Oprindelig meddelelse-----
> Fra: [email protected] [mailto:development-
[EMAIL PROTECTED] På vegne af tsk1958pete
> Sendt: 8. november 2005 15:56
> Til: [email protected]
> Emne: Re: SV: SV: [development-axapta] Passing Arrays to and from
3rd Party DLL
>
> Many Thanks Tom,
>
> I appreciate the tip, a followup question - Does Axapta(Microsoft)
> actually "guard" the memory space and crash if some other program
> writes to that space?
>
> I'm fortunate enough to have the DLL developer working with me, and
> can get changes made on both sides.
>
> I'm new to this "pointer" bit, I get it.. lol.. just takes awhile
> to sink in. Anyway, my current call (much abbreviated) looks like
> this:
>
> Binary Indxrm;
> Indxrm = new Binary(400); // 100 ints * 4 bytes = 400
> LSsolveRingo2.arg(ExtTypes::Pointer)
> iRingoReturn = LSsolveRingo2.call(Indxrm)
>
> In this example, what would I have to change to correctly
> "access the contents using the Binary class."?
> Would I just use something like:
>
> strsomething = Indxrm.value(0)
>
> If the above is incorrect, could you throw me a brief exampl.. I'm
> a fast learner.
>
> Thanks Again to all contributing
>
> Tim Peterson
>
>
>
>
> --- In [email protected], "Thomas Jensen"
> <[EMAIL PROTECTED]> wrote:
> >
> > Hi Tim
> >
> > Another possible solution is to let the DLL allocate the array,
> just return a pointer to it to Axapta and access the contents using
> the Binary class.
> >
> > Kind regards
> > Thomas
> >
> >
> > -----Oprindelig meddelelse-----
> > Fra: [email protected] [mailto:development-
> [EMAIL PROTECTED] På vegne af tsk1958pete
> > Sendt: 6. november 2005 16:59
> > Til: [email protected]
> > Emne: Re: SV: [development-axapta] Passing Arrays to and from 3rd
> Party DLL
> >
> > Byteway,
> > Thanks for sharing, your description of what happens is right on
> > point! My suspicion is Axpata "reserves" the memory space and
when
> > the dll attempts(or actually does) to write to it is the point
> > Axapta crashes. Axapta does not appear to play well with
others..
> > lol.. sorta "I'm gonna take my ball and go home"
> >
> > To answer your question, the DLL is a material optimization
> program
> > that uses linear optimization to calculate how to pattern cut
> > material. The DLL is written in C++ by some very smart
> > mathmeticians specifically for our company. They are actively
> > working with us to modify the DLL in any fashion required to
> > integrate with Axapta.
> >
> > The overview of the interface is:
> > 1) Provide data to be optimized as input for the DLL
> > Input data consists of multiple "fields" of a sales
> > order line. In the code I provided you can see where
> > my test data populates the Binaries with multiple elements
> > 2) DLL processes the input and calculates the optimized solution
> > 3) DLL writes the solution to the memory space of the Binaries
> > passed in the call to DLL
> > 4) Axapta code reads the elements of the binaries bringing the
> > solution back from the DLL...
> >
> > A relatively simple process...
> >
> > As stated the DLL developers can modify this process for the IO
in
> > any way we request. We've considered IO exchange through text
> based
> > files, and could pass random file names(full pathed) for input and
> > output text file as string params. The text based solution seems
> > archaic, and potentially slow. This DLL process will be used
> > extensively, many.. many.. times as each sales order line is
> > entered. We use this to quote our material costs, to speed is an
> > important factor.
> >
> > I'm very new to Axapta Development (normally work in Visual Fox
or
> > VB). Any thoughts you might have on this solution are greatly
> > appreciated
> >
> > Tim Peterson
> >
> >
> >
> >
> >
> > --- In [email protected], Byteway <[EMAIL PROTECTED]>
> > wrote:
> > >
> > > Hi,
> > >
> > > Interresting topic, a couple of years ago I tried the same
> thing:
> > > accessing an array from a dll within Axapta. The result was
that
> I
> > got
> > > the same behaviour as you describe - a hidden feature to close
> > Axapta
> > > even faster than my eyes can see ;-)
> > >
> > > Alternative:
> > > After some research I descovered that there is some kind of
> > standard to
> > > cope with these things. But it is only aplicable to com
> > interfaces.
> > > Google for ¨create COM next value methods".
> > > In pseudo code it goes like this:
> > > while (i get a next value from thirdpartydllmethod) { do
> something
> > with
> > > it }. Note that the method never passes an array, instead it
> > returns the
> > > next-value (until next value is null).
> > >
> > > Also what I discoverd in interfacing with third party dll's is
> > that the
> > > values given back in a fixed array, the offset to read the
value
> > is the
> > > offset-count to the power of two. I don't know if I am clear
> > enough... I
> > > mean you can't just add the count of bytes to the previously
> read
> > value,
> > > to retrieve the next value. That way you would be reading
> > something
> > > which is not there, Axapta would go out of it's own boundries
> and
> > > windows will shut it down at ones.
> > >
> > > Can you give some more details on the peace of software you try
> to
> > > interface with? Perhaps there are better ways to this problem?
> > >
> > > Just some thoughts,
> > > /b
> > >
> > >
> > >
> > >
> > > tsk1958pete wrote:
> > >
> > > > Hi again All,
> > > > Using Tom's suggestions I was able to get the data passed with
> > > > apparent success to the DLL (see code below). The problem is
> > that
> > > > as I step into the dll call line, the Axapta Application
> totally
> > > > crashes and it's icon disappears from the tool bar leaving me
> > looking
> > > > at the editor screen waiting for it to come out of the call!
> > > >
> > > > Axapta just disappears... poof gone.. no error warnings..
> > no "Send
> > > > Error to Microsoft... no nothin!!
> > > >
> > > > I suspect this is occurring at the point in the DLL logic
> where
> > it
> > > > attempts to write the solution to the binary space passed to
> it.
> > > > Anybody have any experience with this?
> > > >
> > > > Thanks to All
> > > > Tim Peterson
> > > >
> > > > CODE IS AS FOLLOWS:
> > > >
> > > > client static int runDLL()
> > > > {
> > > > Dll ringoDLL;
> > > > DllFunction LSsolveRingo2;
> > > >
> > > > int iRingoReturn;
> > > > int nIntParams,nDblParams;
> > > >
> > > > Binary
> > dParams,nParams,RMLength,RMCostCwt,RMAvail,FGCredit,Diam;
> > > > Binary
> > > > EndDrop,Bundle,FGNeeded,FGMax,Iyldpt,Iyield,Indxrm,NumCopies;
> > > > Binary Infgup,Ifg,Ifup;
> > > > Binary Objval,Objbnd,numpats;
> > > >
> > > >
> > > > // Declare Vars used to query output
> > > > real oObjVal,oObjbnd;
> > > > int oNumPats;
> > > >
> > > > ;
> > > > // Binary array equivalents CALC BASED ON TEST
> DAT
> > > > nParams = new Binary(20); // 5 ints * 4 bytes = 20
> > > > dParams = new Binary(32); // 4 dbl * 8 bytes = 32
> > > > RMLength = new Binary(16); // 2 dbl * 8 bytes = 16
> > > > RMCostCwt = new Binary(16); // 2 dbl * 8 bytes = 16
> > > > RMAvail = new Binary(16); // 2 dbl * 8 bytes = 16
> > > > FGCredit = new Binary(32); // 4 dbl * 8 bytes = 32
> > > > Diam = new Binary(32); // 4 dbl * 8 bytes = 32
> > > > EndDrop = new Binary(32); // 4 dbl * 8 bytes = 32
> > > > Bundle = new Binary(8); // 2 ints * 4 bytes = 8
> > > > FGNeeded = new Binary(16); // 4 ints * 4 bytes = 16
> > > > FGMax = new Binary(16); // 4 ints * 4 bytes = 16
> > > > Iyldpt = new Binary(16); // 4 ints * 4 bytes = 16
> > > > Iyield = new Binary(20); // 5 ints * 4 bytes = 20
> > > > Indxrm = new Binary(400); // 100 ints * 4 bytes = 400
> > > > NumCopies = new Binary(400); // 100 ints * 4 bytes = 400
> > > > Infgup = new Binary(400); // 100 ints * 4 bytes = 400
> > > > Ifg = new Binary(400); // 100 ints * 4 bytes = 400
> > > > Ifup = new Binary(400); // 100 ints * 4 bytes = 400
> > > >
> > > > // Binary objects for return solution
> > > > Objval = new Binary(8);
> > > > Objbnd = new Binary(8);
> > > > numpats = new Binary(4);
> > > >
> > > > // Define function parameters
> > > > ringoDLL = new DLL('c:\\RingoDLL\\ringo3');
> > > > LSsolveRingo2 = new DLLFunction(ringoDLL,'LSsolveRingo2');
> > > >
> > > > LSsolveRingo2.returns(ExtTypes::DWord);
> > > > LSsolveRingo2.arg(ExtTypes::Pointer, // nParams
> int
> > > > ExtTypes::DWord, // nIntParams
> int
> > > > ExtTypes::Pointer, // dParams
> dbl
> > > > ExtTypes::DWord, // nDblParams
> int
> > > > ExtTypes::Pointer, // RMLength
> dbl
> > > > ExtTypes::Pointer, // RMCostcwt
> dbl
> > > > ExtTypes::Pointer, // Bundle
> int
> > > > ExtTypes::Pointer, // RMAvail
> dbl
> > > > ExtTypes::Pointer, // FGNeeded
> int
> > > > ExtTypes::Pointer, // FGMax
> int
> > > > ExtTypes::Pointer, // FGCredit
> dbl
> > > > ExtTypes::Pointer, // Diam
> dbl
> > > > ExtTypes::Pointer, // EndDrop
> dbl
> > > > ExtTypes::Pointer, // Iyldpt
> int
> > > > ExtTypes::Pointer, // Iyield
> int
> > > > ExtTypes::Pointer, // Objval
> Ptr
> > > > ExtTypes::Pointer, // Objbnd
> Ptr
> > > > ExtTypes::Pointer, // Numpats
> Ptr
> > > > ExtTypes::Pointer, // Indxrm
> int
> > > > ExtTypes::Pointer, // Numcopies
> int
> > > > ExtTypes::Pointer, // Infgup
> int
> > > > ExtTypes::Pointer, // Ifg
> int
> > > > ExtTypes::Pointer); // Ifup
> int
> > > >
> > > >
> > > >
> > > > // Fill test data
> > > > // The dWord(1,2) parameters ar 1 = Start byte offset 2
=
> > Value
> > > > placed in byte
> > > > nintParams = 5;
> > > > nParams.dWord( 0, 4); // Numfps
> > > > nParams.dWord( 4, 2); // Numrm
> > > > nParams.dWord( 8,100); // Numpatsmx
> > > > nParams.dWord(12,100); // Numelsmx
> > > > nParams.dWord(16, 60); // Limsecs
> > > >
> > > > nDblParams = 4;
> > > > dParams.Double( 0,0.3400); // NeutralAxis
> > > > dParams.Double(8,3.1900); // WtPerFt
> > > > dParams.Double(16,0.0000); // Cpcut
> > > > dParams.Double(24,3.14159); // PI
> > > >
> > > > RMLength.Double( 0,20.00); // Double
> > > > RMLength.Double( 8,40.00);
> > > >
> > > > RMCostcwt.Double( 0,30.43); // Double
> > > > RMCostcwt.Double( 8,30.43);
> > > >
> > > > Bundle.dWord( 0,1); // Integer
> > > > Bundle.dWord( 4,1);
> > > >
> > > > Rmavail.Double( 0,9999.99); // Double
> > > > Rmavail.Double( 8,9999.99);
> > > >
> > > > FGNeeded.dWord( 0, 4); // Integer
> > > > FGNeeded.dWord( 4, 2);
> > > > FGNeeded.dWord( 8,100);
> > > > FGNeeded.dWord(12,100);
> > > >
> > > > FGMax.dWord( 0, 20); // Integer
> > > > FGMax.dWord( 4, 18);
> > > > FGMax.dWord( 8, 6);
> > > > FGMax.dWord(12, 3);
> > > >
> > > > FGCredit.Double( 0,000.00); // Double
> > > > FGCredit.Double( 8,000.00);
> > > > FGCredit.Double(16,000.00);
> > > > FGCredit.Double(24,000.00);
> > > >
> > > > Diam.Double( 0, 12.7500); // Double
> > > > Diam.Double( 8, 48.0000);
> > > > Diam.Double(16, 61.0625);
> > > > Diam.Double(24,132.0000);
> > > >
> > > > EndDrop.Double( 0,14.000); // Double
> > > > EndDrop.Double( 8,16.000);
> > > > EndDrop.Double(16,16.000);
> > > > EndDrop.Double(24,30.000);
> > > >
> > > > Iyldpt.dWord( 0, 2); // Integer
> > > > Iyldpt.dWord( 4, 3);
> > > > Iyldpt.dWord( 8, 4);
> > > > Iyldpt.dWord(12, 5);
> > > >
> > > > Iyield.dWord( 0, 2); // Integer
> > > > Iyield.dWord( 4, 1);
> > > > Iyield.dWord( 8, 1);
> > > > Iyield.dWord(12, 1);
> > > > Iyield.dWord(16, 1);
> > > >
> > > > // Initialize ObjVal, ObjBnd and Numpats to 0
> > > > Objval.Double(0,0.000);
> > > > Objval.Double(0,0.000);
> > > > Numpats.dWord( 0, 0);
> > > >
> > > >
> > > > iRingoReturn = 9999;
> > > > iRingoReturn = LSsolveRingo2.call
> > > > (nParams,nIntParams,dParams,nDblParams,RMLength,
> > > >
> > > > RMCostCwt,Bundle,RMAvail,FGNeeded,FGMax,
> > > >
> > > > FGCredit,Diam,EndDrop,Iyldpt,Iyield,
> > > >
> > > > Objval,Objbnd,numpats,Indxrm,NumCopies,Infgup,
> > > > Ifg,Ifup);
> > > >
> > > > return iRingoReturn;
> > > > }
> > > >
> > > >
> > > >
> > > > --- In [email protected], "Thomas Jensen"
> > > > <[EMAIL PROTECTED]> wrote:
> > > > >
> > > > > Hi Tim
> > > > >
> > > > > Try using the Binary object in stead of the Array class:
> > > > >
> > > > > Binary binary = new Binary(8);
> > > > > Binary binary_out = new Binary(8);
> > > > >
> > > > > binary.dword(0,10);
> > > > > binary.dword(4,20);
> > > > >
> > > > > iReturn = _myFunction.call(iParam1,binary,binary_out)
> > > > >
> > > > > Regards
> > > > > Thomas
> > > > >
> > > > >
> > > > > ________________________________
> > > > >
> > > > > Fra: [email protected] på vegne af
> tsk1958pete
> > > > > Sendt: on 02-11-2005 23:00
> > > > > Til: [email protected]
> > > > > Emne: [development-axapta] Passing Arrays to and from 3rd
> > Party DLL
> > > > >
> > > > >
> > > > >
> > > > > Hi All,
> > > > >
> > > > > Trying to call a standard DLL (not com standard). The
> > parameters
> > > > > passed in are an integer var and an array (input data)
> lastly
> > an
> > > > > empty array of 100 elements is passed that will be filled
> with
> > > > > solution data by the DLL. My problem is that the DLL is
> > getting the
> > > > > int parameter 1 correctly, but not either of the arrays. I
> > didn't
> > > > > think I needed to designate pass by reference.
> > > > >
> > > > > Anybody have a solution
> > > > >
> > > > > I'm calling it as follows:
> > > > >
> > > > > client static int runDLL()
> > > > > {
> > > > > Dll _myDLL;
> > > > > DllFunction _myFunction;
> > > > > int iParam1,iReturn;
> > > > > Array iInParams,iOutSolution;
> > > > >
> > > > > iInParams = new Array(Types::Integer);
> > > > > iOutSolution = new Array(Types::Integer);
> > > > >
> > > > > _myDLL = new DLL('c:\\mydll');
> > > > > _myFunction = new DLLFunction(_myDLL,'myFunction ');
> > > > >
> > > > > _myFunction.arg(ExtTypes::DWord, // iParam1 int
> > > > > ExtTypes::Pointer, // nInParams int
> > > > > ExtTypes::Pointer) // iOutSolution dbl
> > > > >
> > > > >
> > > > > iParam1 = 6
> > > > > iInParams.value(1,10);
> > > > > iInParams.value(2,20);
> > > > >
> > > > > iOutSolution.value(1,0);
> > > > > iOutSolution.value(2,0);
> > > > >
> > > > > iReturn = 9999;
> > > > > iReturn = _myFunction.call
> (iParam1,iInParams,iOutSolution)
> > > > > }
> > > > >
> > > > > Thanks for any help
> > > > > Tim Peterson
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Yahoo! Groups Links
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > [Non-text portions of this message have been removed]
> > > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > --------------------------------------------------------------
-
> --
> > -------
> > > > YAHOO! GROUPS LINKS
> > > >
> > > > * Visit your group "development-axapta
> > > > <http://groups.yahoo.com/group/development-axapta>" on
> the
> > web.
> > > >
> > > > * To unsubscribe from this group, send an email to:
> > > > [EMAIL PROTECTED]
> > > > <mailto:[EMAIL PROTECTED]
> > subject=Unsubscribe>
> > > >
> > > > * Your use of Yahoo! Groups is subject to the Yahoo!
> Terms
> > of
> > > > Service <http://docs.yahoo.com/info/terms/>.
> > > >
> > > >
> > > > --------------------------------------------------------------
-
> --
> > -------
> > > >
> > >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > Yahoo! Groups Links
> >
>
>
>
>
>
>
>
>
>
>
> Yahoo! Groups Links
>
YAHOO! GROUPS LINKS
- Visit your group "development-axapta" on the web.
- To unsubscribe from this group, send an email to:
[EMAIL PROTECTED]
- Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service.

