|
Hi, I need to retrieve data from a printer. I found some information about GDI and function ReadPrinter but I do not know how to properly use it. There are only examples that show how to send data to a printer. Can somebody help me? It is very important for me.
|
|
|
|
|
ReadPrinter is very poorly documented, but from what I can gather, you need to know what commands the print provider (aka print driver) understands before you can get any information from it. Just executing a ReadPrinter wont return and data unless you first call OpenPrinter with the name of the printer and the mode you want to open it in (can't remember off the top of my head exactly what options to use to get bidi support), and then tell the provider what data you want using WritePrinter with the appropriate commands. There's the problem, I can't find any doc's on those commands, or schema options. They're vendor specific, so your best place to find anything would be to contact developer support for your printer manufacturer.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
hi..
i'm going through hell trying to activate the system speaker. when i try to use the "kernel32" Lib API function "BEEP", i only get a beep in the soundcard's speakers. if they happen to be turned off - i get nothing.
note that:
1) i am using windows 98
2) there is a built-in motherboard system speaker. it's device driver is VMM32.VXD, and the devicer manager says it's functioning properly.
3) the internal speaker itself IS working (it beeps every time i turn the computer on).
4) there is a sound card installed. it's an avance ALS120, and it's driver is ALSWDM.SYS.
if anyone knows anything about this - it doesn't matter if it's in visual C++ or visual basic or whatever, just make the thing beep..
and thanx anyway.
|
|
|
|
|
The docs on the Beep API function says:
"Windows Me/98/95: On computers with a sound card, the function plays the default sound event. On computers without a sound card, the function plays the standard system beep."
IIRC, MessageBeep(-1) on old OSes does the trick.
Yes, even I am blogging now!
|
|
|
|
|
MessageBeep(-1) did the trick. i am building a temple for you as we speak.
may you win the lottery or something.
thanx.
BTW - do you know a to control the length of the beep? (using a FOR loop requires a lot of CPU time)
|
|
|
|
|
Where can I find A LOT of information about the Excel, the Workbook, and the worksheet objects? Like, their properties, events, methods and such...
10x a G.
Pablo.Ar
|
|
|
|
|
|
I guess I should´ve mentioned I´m using VB6, but anyway that second ref seems pretty damn good. 10x a million, Dave!
Pablo.Ar
|
|
|
|
|
I'm working on a note control. I have some pop up windows by doing .showdialog. Is there anyway I can do if I close the parent form, all the popup(child forms) will close as well? Thank
|
|
|
|
|
If you call ShowDialog() with the parameter filled in, your Dialog will have a parent. If the Dialog form has a parent, if the parent gets closed, the dialogs will also close. It's simple enough to do, just tell ShowDialog which form is the parent form, usually "Me":
Dim myDialog As New DialogForm2
myDialog.ShowDialog(Me)
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hi,
Thank you all for ur answers.I tried working it out but there still is some problem.I tried the dllimport method but i still have an error saying that the entry point has not been found.this was using salford fortran .i was just wondering if all fortran compilers are compatible with .net platform.when i used the intel fortran 8.0 compiler i was not able to reference the fortran dll as well.the error was that it is not a valid dll or com object.i guess it cudnt recognise the dll.is there anything i can do to get it right??
the dllimport code i used was
_
Public Shared Sub xyz(ByRef x As Integer)
End Sub
call xyz(x)
and in the fotran dll i wrote the following
subroutine Dll2(x)
x=x+1
! Expose subroutine Dll2 to users of this DLL
!
!DEC$ ATTRIBUTES DLLEXPORT::Dll2
!MS$ATTRIBUTES REFERENCE :: x
end subroutine Dll2
this is just an example i was trying to get right.
i need to get it right soon.
thank u for ur help
|
|
|
|
|
It would appear that the .DLL is in a custom format that is not usuable outside the salford fortran runtime. There is nothing you can do to get it in the correct format, other than rewriting the code using the Intel FORTRAN compiler and having it create the .DLL in a standard format.
I don't know this for sure, it's what I suspect...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
You should check Salfords Site:
http://www.salfordsoftware.co.uk/kb/SKB146
Calling routines in object files/DLLs created by other compilers
This applies to:
Salford C/C++ DBOS
Salford C/C++ Win32
Salford FTN77 DBOS
Salford FTN77 Win32
Salford FTN90 DBOS
Salford FTN90 Win32
Salford FTN95 DBOS
Salford FTN95 for Visual Studio .NET
Salford FTN95 Win32
Question
Is it possible to call routines in object files/DLLs created by other compilers?
Answer
Yes using C_EXTERNAL or STDCALL. See the Mixed Language Programming section in the User Guide.
--------------------------------------------------------------------------------
THE INFORMATION IN THIS DOCUMENT IS PROVIDED ON AN AS-IS BASIS WITHOUT WARRANTY OF ANY KIND. PROVIDER SPECIFICALLY DISCLAIMS ANY OTHER WARRANTY, EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL PROVIDER BE LIABLE FOR ANY CONSEQUENTIAL, INDIRECT, SPECIAL OR INCIDENTAL DAMAGES, EVEN IF PROVIDER HAS BEEN ADVISED BY USER OF THE POSSIBILITY OF SUCH POTENTIAL LOSS OR DAMAGE. USER AGREES TO HOLD PROVIDER HARMLESS FROM AND AGAINST ANY AND ALL CLAIMS, LOSSES, LIABILITIES AND EXPENSES.
Document ID: SKB0146
Published on: 12 Feb 2004
|
|
|
|
|
And Here:
Calling a Salford FTN95 DLL from Microsoft Visual Basic
This applies to:
Salford FTN95 Win32
Summary
Calling routines in a dynamic link library created with Salford FTN95 from a Microsoft Visual Basic application.
Solution
An FTN95 DLL that is called by an executable that uses the STDCALL calling convention (e.g. one created using Win32 Visual Basic) must use F_STDCALL in the declaration of all exported subprograms. For example,
F_STDCALL FUNCTION F(X)
INTEGER F,X
F=X
END
Such a function could make calls to Windows API functions provided an interface is provided via, for example, "USE MSWIN" or "INCLUDE <windows.ins>". Alternatively an interface for each API function can be given explicitly. For example,
STDCALL SENDMESSAGE 'SendMessageA' (VAL,VAL,VAL,VAL):INTEGER*4
A call is automatically made to a DLL function called LIBMAIN when the DLL is loaded. If you do not provide a definition of LIBMAIN then SLINK will provide a default for you. LIBMAIN is used to initialise global data. It takes the following form.
F_STDCALL INTEGER FUNCTION LIBMAIN(hInst,ul,lpR)
INTEGER hInst,ul,lpR
!***** Initialise global data here
LIBMAIN=1
END
A simple SLINK script would take the form:
dll
lo f95.obj
exportall
file c:\windows\f95.dll
A Visual Basic program can use calls to the API functions LoadLibrary and FreeLibrary in order to ensure that the DLL does not unload whilst a Visual Basic form is loaded. Here is some sample code for this purpose.
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal s As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (h As Long) As Long
Dim hLibModule As Long
Private Sub Form_Load()
hLibModule = LoadLibrary("f95.dll")
End Sub
Private Sub Form_Unload(Cancel As Integer)
i& = FreeLibrary(hLibModule)
End Sub
--------------------------------------------------------------------------------
THE INFORMATION IN THIS DOCUMENT IS PROVIDED ON AN AS-IS BASIS WITHOUT WARRANTY OF ANY KIND. PROVIDER SPECIFICALLY DISCLAIMS ANY OTHER WARRANTY, EXPRESS OR IMPLIED, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL PROVIDER BE LIABLE FOR ANY CONSEQUENTIAL, INDIRECT, SPECIAL OR INCIDENTAL DAMAGES, EVEN IF PROVIDER HAS BEEN ADVISED BY USER OF THE POSSIBILITY OF SUCH POTENTIAL LOSS OR DAMAGE. USER AGREES TO HOLD PROVIDER HARMLESS FROM AND AGAINST ANY AND ALL CLAIMS, LOSSES, LIABILITIES AND EXPENSES.
Document ID: SKB0169
Published on: 19 Feb 2004
|
|
|
|
|
I have been struggling with several of the winmm.dll API's. One of them is the waveOutGetDevCaps function. The arguments aren't complicated but despite every attempt I can't get it to work properly. I have tried searching for on-line documentation and there are multitudes of them but they all use the function passing the same parameters receiving the same successful results. I can't figure this out. Can anyone help me with this.
<snippet of="" code="">
Public Const MAXPNAMELEN = 32
Public Structure WAVEOUTCAPS
Dim wMid As Short
Dim wPid As Short
Dim vDriverVersion As Integer
Dim szPname As String
Dim dwFormats As Integer
Dim wChannels As Short
Dim dwSupport As Integer
End Structure
Public Declare Function waveOutGetDevCaps Lib "winmm.dll" Alias "waveOutGetDevCapsA"
(ByVal uDeviceID As Integer, _
ByRef lpCaps As WAVEOUTCAPS, ByVal uSize As Integer) As Integer
Dim caps As New WAVEOUTCAPS
Dim dev, hWaveOut, hwnd As Integer
Dim buffer As String = (MAXPNAMELEN)
dev = waveOutGetDevCaps(0, caps, Len(caps))
'the string value produced here is evaluated as null as well as any of the other members which produce 0. I have tried switching the ByRef and ByVal keywords around but this hasn't proven to be a resolution.
txtCaps.Text = "Channels = " & caps.szPname
Any help would be appreciated.
Thanks!
"For God so loved the world...." John 3:16
I only have one boss, J.C.
|
|
|
|
|
What does dev contain when the function returns? The results your getting would suggest that one or more parameters that your passing in are incorrect. Also, we're missing the code that defines the structure WAVEOUTCAPS. It would appear that an attribute is missing that properly defines the structure so it can be marshalled correctly.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
dev returns a value of 0 which from my understanding would indicate that there wasn't a problem passing the function. As documented per MSDN as
Public Const MMSYSERR_NOERROR = 0
However, the value can also be 0 if the last parameter passed which would be evaluated as the size of the WAVEOUTCAPS structure, is determined to be zero as well, then nothing would be copied and the function returns zero also.
So I am uncertain if the 0 value means success or a bad pass of a parameter.
As for the missing attribute, what would that be and where is it documented? Microsoft isn't making it obvious.
Thanks
"For God so loved the world...." John 3:16
I only have one boss, J.C.
|
|
|
|
|
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
This is why I asked for the code that declared the structure. This line makes sure that the structure members get packed together, in memory, in the order that they are declared and, if you follow the Win32 API documentation, the order that the API expects them in.
Without this line, the memory image of the structure can be anything in managed memory. This means that the structure can be moved at any time and can even be spread out and fragmented over a much larger block of memory.
Putting the LayoutKind.Sequential attribute in there makes sure that the structure is arranged in memory properly. ALL structure definitions being marshalled to the API require this attribute, otherwise you'll run into problems like the one you had with this one, and/or you can run into intermittant problems that you just can't figure out why it worked one time and not another...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Okay Dave,
This is a very useful piece of information that I was previously unaware of and I now understand what you meant with your previous inquiry concerning the structure. This was apparently a new requirement for the .NET framework since I don't recall such a requirement under VB6 for structures or what was then termed as "types".
I also noticed the additional line of code that was:
MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)
Seemingly this is the only way to allocate the string buffer within the structure for the returned value in VB.NET that would be the equivalent for VB6 as:
szPname As String * 32
What about the structure members after the "MashalAs" parameter specified for the string member? Will they require anything additional to ensure that the returned values are properly packed in memory before a return also or does the StructLayout parameter apply for the entire structure as I would assume.
Thanks Dave
"For God so loved the world...." John 3:16
I only have one boss, J.C.
|
|
|
|
|
The primitive types after the String, and MarshalAs, are known types with fixed sizes and are automatically Marshaled as the proper types. Typically, the only thing you have to watch out for is the structure member packing, which by default is on 8-byte boundries. Sometimes you'll com acrossed a structure where you have to specify a smaller pack size, typically 4.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
mivey4 wrote:
As for the missing attribute, what would that be and where is it documented? Microsoft isn't making it obvious.
Your actually just scratching the surface of a very BIG topic, call Interop. The documentation starts here[^] with Interoperating with Managed Code. It assumes you already know how the functions your calling work and what their requirements are, like for WaveOutGetDevCaps.
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
mivey4, try this:
Imports System.Runtime.InteropServices
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code removed here"
Public Const MAXPNAMELEN = 32
<structlayout(layoutkind.sequential, charset:="CharSet.Auto)"> _
Structure WAVEOUTCAPS
Public wMid As Short
Public wPid As Short
Public vDriverVersion As Integer
<marshalas(unmanagedtype.byvaltstr, sizeconst:="MAXPNAMELEN)"> _
Public szPname As String
Public dwFormats As Integer
Public wChannel As Short
Public wReserved1 As Short
Public dwSupport As Integer
End Structure
Declare Auto Function waveOutGetDevCaps Lib "winmm.dll" _
(ByVal uDeviceID As Integer, _
ByRef lpCaps As WAVEOUTCAPS, _
ByVal uSize As Integer) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim caps As New WAVEOUTCAPS
Dim dev, hWaveOut, hwnd As Integer
Dim buffer As String = (MAXPNAMELEN)
dev = waveOutGetDevCaps(0, caps, Len(caps))
TextBox1.Text = "Device = " & caps.szPname
TextBox2.Text = "Driver Version = " & caps.vDriverVersion
TextBox3.Text = "Channel = " & caps.wChannel
End Sub
End Class
|
|
|
|
|
sorry, CP messed up the struct:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Structure WAVEOUTCAPS
Public wMid As Short
Public wPid As Short
Public vDriverVersion As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)> _
Public szPname As String
Public dwFormats As Integer
Public wChannel As Short
Public wReserved1 As Short
Public dwSupport As Integer
End Structure
|
|
|
|
|
Okay! That nipped the problem in the bud.
Now for enlightenment for the initial issue. The additional lines of code that obviously made all the difference between success and failure were:
a. Imports System.Runtime.InteropServices
b. StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)
c. MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)
Why must these additional parameters be set in order for the API function to properly work but there isn't any direct or immediately obvious documentation for it? I have used other API structures and passed them receiving the expected results without addition of these parameters. Are there any resources available for VB.NET programmers that provide a good sound source of information for implementing API calls?
My apologies for the oversight of an additional member of the WAVEOUTCAPS structure that was mentioned earlier to me.
----> Public wReserved1 As Short
I use an API Generator utility to generate the Declarations and constants and apparently this additional member wasn't added until after the release of the utility. But I do realize the importance of providing the API calls with everything they expect or there will be problems.
Thanks
"For God so loved the world...." John 3:16
I only have one boss, J.C.
|
|
|
|
|
Here is is a reference:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcn7/html/vaconStructuresAndClasses.asp
|
|
|
|
|