|
Hi,
I have an ActivX chart control with a method AddPoints(). The IDL looks like this...
[id(40)] VARIANT_BOOL AddPoints(BSTR strPlotName, ULONG nVals, DOUBLE* pdXVals, DOUBLE* pdYVals);
In the C# wrapper generated by DevStudio it looks like this...
public virtual bool AddPoints(string strPlotName, uint nVals, ref double pdXVals, ref double pdYVals);
Question is; how do I pass the double arrays to this method from C#?
Thanks.
“If I had asked people what they wanted, they would have said faster horses.”
― Henry Ford
|
|
|
|
|
Oh this old chestnut. I did a certain amount of searching around this issue and I couldn't find a way to make the auto generated wrapper convert X* to X[] instead of ref X. You might have to manually tweak the wrapper.
|
|
|
|
|
I Suspect BobJanova is correct, but I just did some messing around with unsafe code and there is a possability that even though the wrapper is taking a double ref, it may be treating it as a pointer. Check this code out
static void Main(string[] args)
{
double[] testArr = new double[] { 1.0, 2.0, 3.0 };
for (int i = 0; i < 3; i++)
Console.WriteLine(testArr[i]);
test(ref testArr[0]);
for (int i = 0; i < 3; i++)
Console.WriteLine(testArr[i]);
}
public static unsafe void test(ref double x)
{
fixed (double* ptr = &x)
{
ptr[1] = 2.5;
}
}
this produces the following instead of an error.
1
2
3
1
2.5
3
so there is a chance that simply passing a reference to the 0th index in the array might get what you want done. I don't have the wrapper setup to test it out myself.
|
|
|
|
|
I had the same thought but I'm sure I tried passing a reference to the first element and it wouldn't compile. I wonder what I was doing wrong.
|
|
|
|
|
Thanks for the replies,
Passing a ref to the first element compiles ok but i seem to be getting garbage values at the other end (in the ActiveX control). But i have not given up yet.
“If I had asked people what they wanted, they would have said faster horses.”
― Henry Ford
|
|
|
|
|
I've found sometimes the only way to reliably do stuff like this is to use System.Runtime.InteropServices.GCHandle s.
double[] pdXVals = new double[] { 1, 2, 3 };
double[] pdYVals = new double[] { 4, 5, 6 };
GCHandle handleX = GCHandle.Alloc(pdXVals, GCHandleType.Pinned);
GCHandle handleY = GCHandle.Alloc(pdYVals, GCHandleType.Pinned);
handleX.Free();
handleY.Free();
I'm assuming there is a fixed size for the arrays? If not, as there is no size parameter there is no way for the function to know when to stop reading memory and you will get garbage data and/or exceptions.
|
|
|
|
|
You might already have seen this[^], which may help you to resolve your problem.
Henry Minute
Girl: (staring) "Why do you need an icy cucumber?"
“I want to report a fraud. The government is lying to us all.”
I wouldn't let CG touch my Abacus!
When you're wrestling a gorilla, you don't stop when you're tired, you stop when the gorilla is.
Cogito ergo thumb - Sucking my thumb helps me to think.
|
|
|
|
|
i have four radiobutton and a button.first i m selecting item through radiobutton and adding items into textbox on button click_event.now i want that item which are shown in textbox can be edited and reflect back into database.
here main problem is i hav four txtbox which is populated by different database table and table is selected on radio_click event.but i m unable to made the changes into database when user deleted textbox data.
|
|
|
|
|
Member 8233601 wrote: but i m unable to made the changes into database when user deleted textbox data.
I really don't think that anyone here will be able to guess what you are doing wrong in this instance. Please show the code that is failing and explain what results you do expect.
Unrequited desire is character building. OriginalGriff
I'm sitting here giving you a standing ovation - Len Goodman
|
|
|
|
|
Member 8233601 wrote: now i want that item which are shown in textbox can be edited and reflect back into database.
Then write the code to do so; open a connection to the database, and update the record.
Steps are described here[^].
Bastard Programmer from Hell
|
|
|
|
|
i m all done with is problem.Thanks all 4 der precious suggestion.
|
|
|
|
|
I have a x86 c# program which uses Process.StartInfo and Process.Start to run a batch file (ToInstallSql.bat) to install Sql Server 2008 R2 silently which contains:
SQLEXPR_x64_exe /ConfigurationFile=MySqlConfiguration.ini
I have to install 64-bit Sql Server because there are other existing installation of Sql Server products and instances of 64-bit.
The c# program (MyCustAction.exe) contains the following:
Process proc=new Process();
proc.StartInfo.FileName = "ToInstallSql.bat";
proc.StartInfo.RedirectStandardInput = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
proc.Close();
If I directly run the program MyCustAction.exe as administrator, Sql server is installed successfully. But if I add MyCustAction.exe as an InstallShield custom action After File Transfer in an InstallShield project, Sql Server installation failed even if the installation process took longer time than normal with no error message. The Releases/Setup Launcher/Required Execution Level in InstallShield project is set to Administrator. The MyCustAction.exe is embedded with a manifest to run as administrator. I run the InstallShield 2012 Express created Setup.exe as administrator. I checked the error log of SQL Server. It says it could not write to windows registry.
The InstallShield install is an x86 application. But the Sql Server is x64 which is to be installed by MyCustAction which is in turn to be run by InstallShield custom action
The c# program,MyCustAction.exe, and batch file are transferred by InstallShield setup.exe to a subfolder under the installation folder.
My question is how to make windows registry writable for 64-bit. InstallShield disable x64 registry when installing my application of 32-bit.
I tried many different scenarios, still unsuccessful. Please help me.
Sheng
|
|
|
|
|
Check this out:
Registry Redirection[^]
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
Thank you for your answer! I appreciate it.
Sheng
|
|
|
|
|
Hi,
Ever tried to copy into/replace a file inside System32??
I keep getting invalid path error message when it works just fine elsewhere.
Please advise.
|
|
|
|
|
I assume you're using Vista or higher. Basically, your application doesn't have permissions to do anything inside protected directories. This is a good thing, and has been implemented like this for a reason.
|
|
|
|
|
reason for my vote 5 is: I also think that it is the administrative rights problem...
Happy Coding...
|
|
|
|
|
make sure that you have administrative rights on the system..
Happy Coding...
|
|
|
|
|
Even if you have admin-rights, this is typically not done, unless you're trying to hide something from the user. The folder contains system-files for Windows, application-level sh*t should be kept apart.
Bastard Programmer from Hell
|
|
|
|
|
Hey everybody,
I need to show a static Dialog having only a label "Please Wait" before a long process starts. Since both dialog & process are in the main thread, the dialog is frozen. Due to this, till the task is completed, if I click or drag the "Please Wait" Dialog, "End Process" pops in. Thus, I just need to bypass all the WINDOWS MESSAGES other than those needed for dlg.show() & dlg.close().
Please help me. To start with I know how to bypass the messages.
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_CLOSE)
base.WndProc(ref m);
}
I just want to know what all messages I'll have to bypass. Also, is there any thing easier way to do this. Thanx in Advance.
|
|
|
|
|
varunpandeyengg wrote: Thus, I just need to bypass all the WINDOWS MESSAGES
No you need to redesign your process. Move your long running process off the main thread and do the job properly. Mucking around with message handling b/c you are too lazy to use another thread is just dumb.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Due to some limitation of the process, I need to call some functions of main thread plus BeginInvoke isn't performing well. So, I have no choice other than working with Windows Message.
|
|
|
|
|
There is no other way. Running the long running job on new thread is the way to go. Because both the message handling code and long running code are getting executed on the main thread. Which means either one can execute at a time. Since the long running job is blocking the thread, main thread will be in waiting state and your message processing code won't get executed.
Why do you think BeginInvoke is not performing well? Do you have benchmarks which shows BeginInvoke is slow?
Best wishes,
Navaneeth
|
|
|
|
|
That is a bad idea. As others have said, your long operation needs to move to another thread. There are a couple of ways to do that, the best choice depends on the operations. What is it you are doing? How long does it take, and how often does your code need to access the GUI in that time?
BTW1: I don't use Control.BeginInvoke() ; when I need invoking, I use Control.Invoke() .
BTW2: IMO a long operation needs a way to get cancelled (the user sits there waiting and has the time to change his mind); and a progress bar is also nice to have. These are additional reasons to do things properly, i.e. with an extra thread.
|
|
|
|
|
I'll download program of PKI C#(asp.net),who can tell me the url?
|
|
|
|