Need help calling a proprietary C DLL from Python
Craig
craigm3604 at gmail.com
Wed Mar 26 07:27:26 EDT 2008
On Mar 26, 12:24 am, Dennis Lee Bieber <wlfr... at ix.netcom.com> wrote:
> On Tue, 25 Mar 2008 08:24:13 -0700 (PDT), Craig <craigm3... at gmail.com>
> declaimed the following in comp.lang.python:
>
> > 41 0 0 0
> > 7 0 0 0
> > Which makes sense for two reasons:
> > 1. It would only return the non-space-filled part of the returned key.
> > 2. At least from VB6, the variable does not even have to be used
> > before the call.
>
> Hmmm... I wonder what the library would have done if you just passed
> a 0 to it... Rather than even doing that SysAlloc...() mess...
>
> PriKey = ctypes.int32(0) #or whatever the syntax was
>
> ... byref(PriKey)
>
> May with an effective null pointer the library would just allocate
> directly rather than trying to determine the length field of the one
> passed in.
>
> Something for the future, maybe...
>
> > print " DistID = \x22%s\x22" % DCOD.DistID
>
> You realize you can avoid those \x22 literals by changing the outer
> quotes?
>
> print ' DistID = "%s" ' % ....
>
> or using triples
>
> print """ DistID = "%s" """ % ...
>
>
>
> > In other files, some of those fields are VB6 currency types, which
> > have been described as 8-byte integers with an implied 4 decimal
> > places (which I guess would be __int64 or c_longlong and then divide
> > by 10,000, or simply put a decimal point 4 away from the end).
>
> Don't divide directly; you might lose significance as the result is
> converted to double-precision float.
>
> You could possibly convert to string, splice in that . and then pass
> the result to the Decimal module/type...
> --
> Wulfraed Dennis Lee Bieber KD6MOG
> wlfr... at ix.netcom.com wulfr... at bestiaria.com
> HTTP://wlfraed.home.netcom.com/
> (Bestiaria Support Staff: web-a... at bestiaria.com)
> HTTP://www.bestiaria.com/
I made these changes:
# SecKey =
windll.oleaut32.SysAllocStringByteLen("1234567890123456789012345678901234567890\x00",
41)
SecKey = c_int32(0)
ci_SecKey = c_int32(SecKey)
# PriKey =
windll.oleaut32.SysAllocStringByteLen("ABCDEFGHIJKLMNOPQRSTUVWXYZ12345678901234\x00",
41)
PriKey = c_int32(0)
ci_PriKey = c_int32(PriKey)
And got:
Traceback (most recent call last):
File "C:\temp\vbisam_test_2.py", line 123, in <module>
ci_SecKey = c_int32(SecKey)
TypeError: an integer is required
Creating 2 "dummy" BSTR's isn't too bad of an option anyway.
No, being somewhat new I didn't realize I could use (') in place if
(") if I wanted to use a (") as a literal, but it seems to make a lot
of sense now. I don't understand why I never tried it.
As for the division vs. string manipulation, I agree - the string
seems to be the simplest way to insure no loss of data.
Thanks for all the input.
More information about the Python-list
mailing list