|
The problem with using OnStart's parameters is that the SCM is already starting the service at that point, and must have discovered the name beforehand.
My company currently has a few exes which we run as multiple services on the same machine. Our design goals caused us to end up with multiple copies of the exe (different file names). Each are registered individually as services, which includes the exe name as part of the name of the service. With this setup, the service installer and the service itself can both determine the proper service name by detecting the name of the running executable.
You may be able to modify the installer to check for certain parameters at the time that the service is registered, then pass those same parameters to the exe when the service is started. It doesn't seem impossible, but the key is to distinguish between services at installation time.
John
"You said a whole sentence with no words in it, and I understood you!" -- my wife as she cries about slowly becoming a geek.
|
|
|
|
|
I'm strugging to get the BindtoObject method of the IShellInterface working, but it throws errors no matter what I do.
At first i thought it was a design problem, where i was using the wrong PIDL. But i pulled the display name from it, and parsed that for a pointer, and it still isn't working, so i'm somewhat baffled.
here is the method as i've written it:
[PreserveSig]<br />
int BindToObject( <br />
IntPtr pidl,<br />
IntPtr pbc,<br />
Guid riid,<br />
out IntPtr ppv);
When i call the method, i call it as follows:
DesktFolderInterface.BindToObject(FolderPIDL, IntPtr.Zero, IShellGUID, out pFolderInteraface);
where the Desktop folder is the object i'm calling the bind from. The FolderPIDL i have tried as both the return from the SHBrowseForFolder dialog, and then by parsing the name of the folder retrieved from the dialog. Neither of which succeeded.
The GUID is the GUID value for IShellFolder, retrieved by this line:
Guid IShellGUID = Marshal.GenerateGuidForType(shellType);
For the pbc value, i've used both IntPtr.zero, and a variable defined as IntPtr.zero.
I'm not sure why this won't work, but i thought it was a layout mistake at first, now i'm not so sure.
Can anyone help?
Cheers
Cata
[Edit]: I've used all these components in a different COM method, and they worked fine, so i know that the components are all valid. Which is why it is confusing that it does not work.
|
|
|
|
|
I've found some sample code that showed BindToObject as using a ref GUID, rather than an unrefferenced. This now works, but i have no idea why.
Could anyone shed any light on this?
Cheers
Cata
|
|
|
|
|
Guid is a value type (a struct ), not a reference type (a class ). In the original code (not using ref ) the marshaller tries to pass the IID by value, which isn't compatible with the interface.
The BindToObject method takes a REFIID in the unmanaged interface, so needs to be matched with a ref Guid in the managed interface.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
I figured that out, while it WAS working with ref, i also got it working without the ref using MarshalAs(UnmanagedType.LPStruct).
But thanks all the same, it clears up a few holes in my thinking.
Cata
|
|
|
|
|
Hi. This is probably real easy, but I just can't seem to figure it out. I have a dataset that returns a unique value. I would like to move that value to a textbox. No matter what I try, I can't get my code to fill the textbox.
I use a dataadapter, dataset, sqlcommand and sqlparm to read a sql2000 stored procedure. I put in the city name and get out the unique city id number we use. I've run teh stored procedure separately and I know it works. Do I databind the textbox to the dataset?
This is the code I'm currently using:
da = new SqlDataAdapter("ap_prs_frm_addr_urbn_cmty_id", addr_urbn_conn);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
ds = new DataSet();
SqlParameter addr_urbn_parm;
addr_urbn_parm = new SqlParameter("@cmty_desc", System.Data.SqlDbType.VarChar);
addr_urbn_parm.Direction = ParameterDirection.Input;
addr_urbn_parm.Value = ddlAddrUrbnCmty.SelectedItem.Text;
addr_urbn_parm = new SqlParameter("@cmty_id", System.Data.SqlDbType.VarChar);
addr_urbn_parm.Direction = ParameterDirection.Input;
addr_urbn_parm.Value = ds.ToString();
da.SelectCommand.Parameters.Add(addr_urbn_parm);
addr_urbn_conn.Open();
da.Fill(ds);
addr_urbn_conn.Close();
this.txtAddrUrbnCmtyID.DataBind();
Help!!!!!!!
Krisman
|
|
|
|
|
try this
DataSet dSet = new DataSet;
///fill DataSet here
if(dSet.Tables["YourTable"].Rows.Count >0)
TextBox.Text=dSet.Tables["YourTable"].Rows[0]["YouFieldName"].ToString();
|
|
|
|
|
Not quite getting result I thought, but at least there is a result! I'll do some more tinkering.
Thanks!
Krisman
|
|
|
|
|
Or try using a Convert.ToString() around your DataSet result. Somehow ToString sometimes returns the Class name, i.e. DataColumn
|
|
|
|
|
You can't just call DataBind() and expect .NET to solve everything for you.
You need to specify to which property of the textbox you want to bind the data to, and the table and column in the dataset.
Here's an example to bind the data to textbox's text property:
this.txtAddrUrbnCmtyID.DataBindings.Add(new Binding("Text", ds, "tableName.columnName"));
For more information, check the MSDN site for Binding Class[^].
Edbert P.
Sydney, Australia.
|
|
|
|
|
This will only work in a Windows Form, I've learned that much. I'm building WebForms, so I have to come up with different round-about ways to do things. Microsoft has never been known for being user and/or developer friendly.
Krisman
|
|
|
|
|
I doubt that, because I have used data binding in my web project.
Here's an excerpt of the code that I used:
cbApplication.DataSource = dsApplication.Tables(0)
cbApplication.DataTextField = "DirectoryName"
cbApplication.DataValueField = "IDDirectory"
cbApplication.DataBind()
Edbert P.
Sydney, Australia.
|
|
|
|
|
I'll have to try again. But I keep getting errors and our .Net gurus where I work (our network guys) said it's because I'm trying to use a Windows Forms functionality with a Web Form. But I'm also working without a Localhost because of the way .Net was installed on our systems and servers.
Krisman
|
|
|
|
|
I've been looking around the forums for hints on adding to the Windows context menu. I think I've figured it out reading eh Windows Shell programming guide. But I noticed i have install the DOSHere PowerToy some time ago, but I have never seen the DOS Here menu option in the Windows shell menu for directories. Does anyone know if XP no allows Context menu extensions for Directories anymore ?
here is the registry seetings for the DOS Here shel entry that does not show up:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\Directory\shell]
@="none"
[HKEY_CLASSES_ROOT\Directory\shell\DosHere]
@="Command &Prompt Here"
[HKEY_CLASSES_ROOT\Directory\shell\DosHere\command]
@="C:\\WINDOWS\\System32\\cmd.exe /k cd \"%1\""
I even tried my own but it didn't work
|
|
|
|
|
|
i know this sounds simple but can someone please tell me how i can draw boxes and circles to the printer
thanks
chad
|
|
|
|
|
Check out the PrintDocument and Graphics classes. Printing is essentially no different from drawing on a windows form, the medium is just different.
|
|
|
|
|
How can you lock a file in .NET? I have a windows application that reads xml files. If two users are trying to read the same file, I want to lock the file so the second user can't read or change the file.
I'm looking for the most bare bones lock and unlock functionality.
Thanks
|
|
|
|
|
The System.IO.FileStream can do this. Read the .NET Framework SDK for more information:
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None);
XmlTextReader reader = new XmlTextReader(stream);
try
{
}
finally
{
reader.Close();
stream.Close();
} This is a very simplistic example. Read about the FileStream constructor for more information.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I just figured this out:
private bool LockFile( string sFilePathToLock )<br />
{<br />
bool bFileLocked = false;<br />
<br />
if( File.Exists( sFilePathToLock ) && ( File.GetAttributes( sFilePathToLock ) != FileAttributes.ReadOnly ) )<br />
{<br />
File.SetAttributes( sFilePathToLock, FileAttributes.ReadOnly );<br />
<br />
bFileLocked = true;<br />
}<br />
<br />
return bFileLocked;<br />
}<br />
<br />
private bool UnLockFile( string sFilePathToUnLock )<br />
{<br />
bool bFileUnLocked = false;<br />
<br />
if( File.Exists( sFilePathToUnLock ) && ( File.GetAttributes( sFilePathToUnLock ) == FileAttributes.ReadOnly ) )<br />
{<br />
File.SetAttributes( sFilePathToUnLock, FileAttributes.Normal );<br />
<br />
bFileUnLocked = true;<br />
<br />
}<br />
<br />
return bFileUnLocked;<br />
}
Hope this helps.
|
|
|
|
|
Although I'm a C# newbie, I can see Manster's solution will not work. See my (AS) comments below:
if( File.Exists( sFilePathToLock ) && ( File.GetAttributes( sFilePathToLock ) != FileAttributes.ReadOnly ) )<br />
{<br />
File.SetAttributes( sFilePathToLock, FileAttributes.ReadOnly );<br />
<br />
bFileLocked = true;<br />
}<br />
<br />
return bFileLocked;<br />
}
The original reply (to use FileStream) seems more like it, but you still need to trap the error when it fails to open the file because it is already locked.
|
|
|
|
|
This is not a correct solution. This only makes the file read-only to programs that check it. See my post for the correct solution, a solution that has been used for as long as filesystems have been around. This is the way it's supposed to be done and truly locks it while it's open from reading or writing by other processes.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Hi,
I want to protect my component so i followed the sample from Microsoft but i get always the LicenseException. I have to say that i don't know how to implement the part in the host application. That a part of the code of my component :
[LicenseProviderAttribute(typeof(LicFileLicenseProvider))]
public class Info: Component
{
private License license = null;
public Info()
{
license = LicenseManager.Validate(typeof(Info), this);
}
Thanks in advance
|
|
|
|
|
Read the documentation for LicFileLicenseProvider.GetLicense . The default LicFileLicenseProvider imlpementation looks for a file named myClass.lic, where myClass is the full name of the class. So, if you have a namespace like MyNamespace.MyClass , you must have a file in the same directory as your assembly that contains the component called MyNamespace.MyClass.lic. Inside that file you must include "MyNamespace.MyClass is a licensed component.".
Note, this LicenseProvider is meant only as an example. This is by no means secure and you should derive your own LicenseProvider to provide a more secure means of licensing your control.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I want my program to open a postscript file and send Ctrl+C to ghostview,
this is part of my code:
Process.Start("gsview32.exe", openFileDialog.FileName);
SendKeys.Send("^c");
but I found ^c was sent to my own program not to ghostview,
someone told me I should use SetForegroundWindow to activate ghostview,
(like AppActivate in VB)
but I don't know how to give the parameter to SetForegroundWindow,
Can anyone give an simple example to activate my ghostview...??
Thanks a lot !!
|
|
|
|