|
RAVI H R wrote:
I see following
methods "Equals","GetHashCode","GetType" and "ToString".
I donot see any other properties or methods.
This means that appropriate SAP references are missing. What you said next confirms it.
RAVI H R wrote:
After this I could see the components is solutions explorer(SE). I saw additional thing in SE by name "stdole".
Now you probably see the names SAPBAPIControlLib_1_2 and SAPLogonCtrl_1_1 in the reference. In your file can you type SAPBAPIControlLib_1_2. , what's brought up by intellisense ?
RAVI H R wrote:
what could be wrong ?
My crystal ball sees a marshaling problem, for instance the System property passed as a VARIANT** instead of a BSTR, or something like that. But what I say is already beyond the simple thing : you should first be able to see the System property in the intellisense dropdown box.
You may send me these 2 files, so I give a look.
sometimes it helps to look at the IL generated code
a MS guy on develop.com "answering" .NET issues
|
|
|
|
|
Hi Stephane,
You have written
Now you probably see the names SAPBAPIControlLib_1_2 and SAPLogonCtrl_1_1 in the reference. In your file can you type SAPBAPIControlLib_1_2., what's brought up by intellisense ?
I see in reference
SAPBAPIControlLib and SAPLogonCtrl.
Intellisense doen't show anything when i type SAPBAPIControlLib_1_2.
I tried one more thing
C# CODE
-----------
APLogonCtrl.SAPLogonControl oLogonControl=new SAPLogonCtrl.SAPLogonControl();
//SAPBAPIControlLib.SAPBAPIControl conn=new SAPBAPIControlLib.SAPBAPIControl();
SAPLogonCtrl.Connection conn=new SAPLogonCtrl.Connection();
conn=(SAPLogonCtrl.Connection)(oLogonControl.NewConnection());
conn.Client="500";
conn.User="";
conn.Password="";
conn.Language="en";
conn.ApplicationServer="localhost";
conn.System="00";
bool bRtcd=conn.Logon(0,false);
if(bRtcd!=true)
Console.WriteLine("bRtcd="+bRtcd.ToString());
I get invalid typecast the code compiles when I execute I get Invalid Typecast exception for conn=(SAPLogonCtrl.Connection)(oLogonControl.NewConnection()). The oLogonControl.NewConnection() returns object.
I will send across the two dlls through email
Thanks
Regards
Ravi H R
|
|
|
|
|
I need to read a binary file into a ushort array. The file was created with another app, and just consists of two bytes per ushort (big endian). FileStream.Read will get the bytes in OK - as bytes. I'd like to read them in directly to ushort. Sounds simple. Is it?
|
|
|
|
|
David Williams wrote:
I'd like to read them in directly to ushort. Sounds simple. Is it?
It does sound simple, especially if you see how a mapping of the will look. Unfortunately there is no direct way.
I would make a class deriving from FileStream and overload the Read method with some thing like this:
public ushort ReadUShort()
{
return (ushort) ((ReadByte() << 8) + ReadByte());
}
public int Read( ushort[] buffer, int offset, int length)
{
Position += offset;
int i = 0;
if (CanRead) {
for (; i < length; i++)
{
buffer[i] = ReadUShort();
}
}
return i;
}
You can try that, someone might have an easier idea
Hope this helps
Give them a chance! Do it for the kittens, dear God, the kittens!
As seen on MS File Transfer: Please enter an integer between 1 and 2.
|
|
|
|
|
Yep. This works, and you do have the bit ops correct. Thanks
|
|
|
|
|
David Williams wrote:
Yep. This works, and you do have the bit ops correct. Thanks
Cool
I remembered I saw something like << 16 for Int32 , so the guess was made accordingly hehe.
However, the way I did it may not be (and probably is not) efficient.
You maybe use the Encoding class (UTF8 and Unicode (BigEndian) ) in a reverse fashion, it sounds a lot like you are dealing with a UTF8 to Unicode(BigEndian) conversion.
Alternatively, the more "dangerous" way is to use a bit of marshalling, remember what I said about the way the data is laid out in memory. So make a small converter.
ushort[] ConvertToUShortArray( byte[] array)
{
int size = Marshal.SizeOf(typeof(byte)) * array.Length;
ushort[] output = new ushort[array.Length/2];
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(array, 0, ptr, array.Length);
Marshal.PtrToStructure(ptr, output);
Marshal.FreeHGlobal(ptr);
return (ushort[])output;
}
Ugly!! but efficient
Hope this helps
Give them a chance! Do it for the kittens, dear God, the kittens!
As seen on MS File Transfer: Please enter an integer between 1 and 2.
|
|
|
|
|
I have big problem for making class deriving from FileStream or BinaryReader
I need to read a binary file into a some struct. Pleas help.
|
|
|
|
|
Check out BinaryFormatter.Deserialize
I'm pretty sure that will do the job for you.
Paul
|
|
|
|
|
The formatters are used for serializing and deserializing classes/structures to and from streams. They also write and read an extra header that tells the runtime what type of object is in the stream and what name (if any) it has.
To sum it up; the formatter can't be used unless it was used to create the data.
James
Sig code stolen from David Wulff
|
|
|
|
|
Daaamn! That's very cool... but slightly annoying if it's not what you want
Paul
|
|
|
|
|
Yeah, I tried the deserialize and found it needed a header. Just to see what it needed, I serialized a 10 byte binary file and found the binary formatter put 28 bytes of header up front. Oh, well. lippie's solution works. Thanks for the response, though.;)
|
|
|
|
|
I think the easiest thing to do is to use a BinaryReader, and just call ReadUInt16().
|
|
|
|
|
So it is simple
Give them a chance! Do it for the kittens, dear God, the kittens!
As seen on MS File Transfer: Please enter an integer between 1 and 2.
|
|
|
|
|
No, not simple. Gunnerson's BinaryReader works, but for little endian, not big.
|
|
|
|
|
This works for little endian. Will it work for big endian if I call it thus: 16IntURead()
|
|
|
|
|
I think the answer to that would be "no". You'd need to call ReadUInt16FlipFlopBytes()...
If you need to do this, you can either do the byte flip yourself, or you may be able to use the IPAddress class.
|
|
|
|
|
While Winform application and other applications(such as words, excel, etc) are running in user's desk top, I want when new message comes within winform application, no matter the status of Winform application is (minimized window, inactive,etc), the message form shows on the top of other applications they are running. It is similar to outlook schedual warnings, when it is the warning time, it comes out to draw your attention away from other things you are working on. Is it possible to achieve it?
Thanks
|
|
|
|
|
I hope you will never achieve this. That's annoying sh*t. ( (
Why not use a blinking systray instead ?
sometimes it helps to look at the IL generated code
a MS guy on develop.com "answering" .NET issues
|
|
|
|
|
StephaneRodriguez wrote:
That's annoying sh*t
Agree!
Give them a chance! Do it for the kittens, dear God, the kittens!
As seen on MS File Transfer: Please enter an integer between 1 and 2.
|
|
|
|
|
To anybody:
Hi. I'm trying to get all items of the Internet Explorer's ComboBox through a C# source code. So far I've got the handles to the child windows. But how to extract all items? Must I open the combobox to fetch all urls? There is no result on my efforts.
I used a SendMessage and got no error messages. Where is my fault?
Is anybody out there to help me a little?
|
|
|
|
|
Not a C# topic. Ask WIN32 gurus. IMHO, there is nothing particular about IE combo-boxes, except they are subclassed (seen with Spy++).
sometimes it helps to look at the IL generated code
a MS guy on develop.com "answering" .NET issues
|
|
|
|
|
Thanks.
I'm a little late responding your mail.
Well, I beg your pardon but still I would say it is a C# topic.
Most of my informations I got from VB. And VB apps seems to be working.
By the way I got the right handle to the comboBox (I guess) and I am able to retrieve informations about total listBox entries and text length of each entry. But I do not succeed retrieving characters or strings.
The fact of handling a ComboBoxEx control does not mind because simple comboBoxes in other applications do not send back characters or strings too.
Here's a reflection on some of my code portions:
[DllImport("user32.exe")]
public static extern int SendMessage(int cbHandle, int Msg, int wParam, object lParam);
...
const int CB_GETLBTEXTLEN = 0x0149;
const int CB_GETLBTEXT = 0x0148;
const int CB_GETCOUNT = 0x0146;
...
private void listBox2_DoubleClicked(object sender, EventArgs e)
{
int lbAmount = SendMessage(cbHandle, CB_GETCOUNT, 0, 0);
char[] ch;
for(int i = 0; i<lbAmount, i++)
{
int txtLength = SendMessage(cbHandle, CB_GETLBTEXTLEN, i, 0);
ch = new char[txtLength+1];
SendMessage(cbHandle, CB_GETLBTEXT, i, ch);
string itemText = new String(ch);
listBox3.Items.Add(ch);
}
}
Can you locate any essential faults or do you think, it is still not a C# topic? Then I will believe you.
Thanks again
Tom LaBenche
|
|
|
|
|
Tom,
I have no PC at the mo under my fingers, but from what I see here are the errors :
- user32.exe --> does not exist, use user32.dll instead
- the SendMessage PInvoke signature uses an int for lParam, not an object
- retrieving combobox content is not like this AFAIK
The reason why it is not C# is clear : that's raw window messaging, hence WIN32. This is to underline clearer semantics.
|
|
|
|
|
Solved!
|
|
|
|
|
hi,
i have the well-known worker-thread doing some computations in the background. when there is an exception raised in this thread, it simply vanishes into hyperspace.
is there any standard-way of handling exception thrown by the worker-thread in the calling thread?
i could do numorous nasty hacks and workaround, but i don't know any "nice" way
thx for ideas.
:wq
|
|
|
|