|
Probably what I would do is have the UI thread do the graphing, and a single other thread to handle the comms. If you set the comms up in a BackgroundWorker[^] it's pretty simple to do because it has the ProgressChanged event, which the UI can subscribe to. It gets a progress event, the handler gets the data (with a lock to make sure it's thread safe) and does the graphing. That way, nobody has to wait (except the background thread which is waiting for physical data anyway).
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
Excellent find, thank you.
That is truly daunting material to master at first glance.
I see 9 properties, 22 Methods, and then 4 events for good measure.
I think that's 792 possible combinations.
I will be searching for example code, and welcome any suggested links.
|
|
|
|
|
It's not as complex as it looks - if you look at the example on the same page, you will find that you need about two properties, two method, and two events if you ignore the cancellation stuff (which you can since this is unlikely to be a thread that needs cancellation)
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
OriginalGriff wrote: unlikely to be a thread that needs cancellation Ack, my bad.
This thread will need to be canceled and restarted at the user's whim. The external box can start and stop, and it has a special "Alert" button just to send a little notice to the PC GUI.
That, plus, there will be disk files that save the data and observations, and blah blah blah.
|
|
|
|
|
Why? If you start and stop it, it won't get the message from the device...
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
Oh, that kind of "cancel". Got it. cool
|
|
|
|
|
Just looked for info on the BackgroundWorker class.
Found This[^]
First thing in the description was
"...The Silverlight BackgroundWorker class provides..." I stopped immediately. Sorry for the feeble braincells here; just want to make sure that I don't have to require special software on the users machine.
I took a quick look at this[^] page and I see mostly stuff about internet and web browsers.
Was my view of the forest obliterated by a tree ?
|
|
|
|
|
The link I pointed you at is the standard .NET BackgroundWorker - it doesn't need Silverlight (or anything extra that isn't already needed to run c#) A quick look says it it pretty much the same class anyway - all the events and properties are the same.
MS do reuse names - look at the number of Timer classes you could play with if you wanted to!
If you get an email telling you that you can catch Swine Flu from tinned pork then just delete it. It's Spam.
|
|
|
|
|
Hi
I've got a Delphi32 DLL that I have to call from C# and have a .h, .hpp, and .bas header file.
Would it make most sense to use the .hpp file to create a Class that will wrap the DLL? Seems so to me.
Unfortunately, I don't do C++
It sort of makes sense, but not completely. Mostly, I know void * should be IntPtr, and char * should be string. But that's about it.
For instance,
const char bapiDll[] = "BAPI32.DLL";
HINSTANCE hLib;
enum TParamType { literal, reference, list } ParamType;
void * pRPC;
should turn into
const string bapiDll = "BAPI32.DLL";
uint HINSTANCE, hLib;
enum TParamType { literal, reference, list } ;
IntPtr pRPC;
Yes? No?
But what do I do with the prototypes and what follows inside the actual guts of the thing? like
void RPCBPropGet ( char * s, char * t);
which obviously has something to do with
void TRPCBroker::RPCBPropGet ( char * s, char * t)
{
iRPCBPropGet(pRPC, s, t);
}
and
TRPCBroker::TRPCBroker()
{
hLib = LoadLibrary(bapiDll);
if((unsigned)hLib<=HINSTANCE_ERROR)
{
char bfr[40];
wsprintf(bfr, "Failure loading library: %s", bapiDll);
MessageBox(NULL, bfr, toolSet, MB_OK|MB_APPLMODAL);
UnLoad = true;
}
. . .
iRPCBPropGet = (void (__stdcall*)(void *, char *, char *)) GetProcAddress(hLib, "RpcbPropGet");
. . .
UnLoad = false;
pRPC = iRPCBCreate();
};
Any good references out there that'll cover this without me having to spend days reading through everything I don't want to know? Or anyone incredibly bored with no life who wants to hold my hand through all 139 lines of it (including empty and comment lines :p )?
|
|
|
|
|
Luc (Pattyn) had a nice article on 'P/Invoke' that Ive found useful .. http://www.perceler.com/articles1.php?art=pinvoke1[^]
Im sure there used to be some automated tools out there that would assist in converting function prototypes (c++) into their C# .NET equivalent, but cant find them right now
I had a similar issue, needing to use PGP SDK (Commercial) from C# - I ended up with essentially 3 layers :-
a) Interop Layer
b) C++ DLL exposing/combining lower level PGP SDK functions into higher functions - for example, the encrypt_file procedure uses key management functions, encrypt functions from the SDK
c) the PGP SDK DLL
It all depends on what functionality you need to expose from your DLL how you 'wrap it'
There's another approach, but I havnt used it which is c++/CLI
|
|
|
|
|
Luc's looks promising. Thanks.
I think I tried one of the automated online converters once...and it came up with line after line of "ya gotta do this part by hand".
|
|
|
|
|
Have a look at x86 calling conventions[^]
I assume that header file is for C++ Builder, and the delphi dll will use what the article calls 'Borland fastcall' which is different from 'Microsoft fastcall' - so you're probably going to need to wrap the functions and expose them using the __stdcall calling convention.
GenJerDan wrote: everything I don't want to know?
Not the most promising attitude for a developer - and calling conventions is something I would think you need to understand.
Best regards
Espen Harlinn
|
|
|
|
|
I've never had to deal directly with DLLs, or at least not to try to use one that wasn't friendly with the rest of the program....and I started I started in 1992 or so.
Push comes to shove, I don't even have have to do this now. I've got Delphi sitting here, too.
I just think it might be a good idea if I didn't have to keep running a virtual machine to write these things. (Delphi 5 won't install on 64bit Windows.)(Yes, I said Delphi 5)
The __stdcall is already there in the header, so I assume the DLL was written to work with it.
|
|
|
|
|
GenJerDan wrote: I've got Delphi sitting here, too
Delphi has always been one of my favourite development tools, I've been using it since version 1 - but, seriously, Delphi 5, that makes me nostalgic.
GenJerDan wrote: I started in 1992
I believe I was working on a C++ IDE for IBM and OS/2 at that time.
GenJerDan wrote: __stdcall is already there in the header
I assumed the code above was from the header file, and I only saw __stdcall in one place.
Go for Delphi XE3[^], assuming you haven't done any magic related to getting notified on object destruction, which was something many Delphi developers did, porting the code should be pretty easy.
Good luck
|
|
|
|
|
Read up on Marshalling and unmanaged code. Normally C# can handle unmanaged code pretty well.
Although it might take some fiddling (searching) .
[EDIT]
Take in account that older code still takes ASCII strings or worse (1 byte vs 2 bytes) and even C# integers can be C++ longs, ...
[/EDIT]
|
|
|
|
|
Since you have the .h and .hpp files for your DLL, you might want to give this a shot. I have used it extensively to help me generate pinvoke signatures. The link for the generator is included on the page.
pinvoke signature generator[^]
|
|
|
|
|
I am a newbie to C#, my development environment is:
Visual Studio 2010 Ultimate Edition
Sql Server 2005
Programming Language C# 2010
I've a form with Unbound Datagridview, from which data is save to Sql Server 2005 by looping through For..Each and pass SQL INSERT Statement when user clicks Save button without any problem.
Now what I need is a way that for same Save button, if data is saved in Sql Server then DataGridView will bind to that records so that if user want to Update/Delete/Add data he/she just need to edit the data and again press Save button. All records will share the same unique ID. It's a products database, and when user click save it will generate a transaction Id same for all products user enter when saving. So I think I need to generate a Select statement and retrieve all those records user save through that Unique ID, but then how to bind it to DataGridView datasource and how to Update/Delete through SqlAdapter or other?
Thanks and best regards
Ahmed
|
|
|
|
|
I'm trying to add Microsoft IObjectSafety Interface to my code. I send string "MyParam" from JavaScript and catch it in my C# code like this:
private string myParam = "Empty";
public string MyParam
{
get
{
return myParam;
}
set
{
myParam = value;
}
}
After I add the IObjectSafety interface this doesnt work anymore, I get error interfaces cannot contain fields. How do I get the MyParam without using fields?
This is the code:
public interface IObject
{
[DispId(1)]
string MyParam; <--- error
};
public class WMC.PlayerLoader : IObjectSafetyImpl, IObject
{
#region [IObject implementation]
private string myParam = "Empty";
public string MyParam
{
get
{
return myParam;
}
set
{
myParam = value;
}
}
#endregion
|
|
|
|
|
Are you sure that an interface[^] is the correct mechanism for your problem?
One of these days I'm going to think of a really clever signature.
|
|
|
|
|
I need to add the IOBjectsafety interface to get rid of the message ActiveX might not be safe message when using it locally, I don't think there is any other way around that except verisign. All the methods on the interface work fine except getting that string.
|
|
|
|
|
Joni_78 wrote: string MyParam; <--- error
Your implementation of MyParam is a property, not a field. You should declare this as string MyParam { get; set; } in the interface definition (which overcomes the interface containing fields error as well).
|
|
|
|
|
I've newer done this like that before. Do I need to change anything in this, or should it work as it was?
public class WMC.PlayerLoader : IObjectSafetyImpl, IObject
{
#region [IObject implementation]
private string myParam = "Empty";
public string MyParam
{
get
{
return myParam;
}
set
{
myParam = value;
}
}
#endregion
|
|
|
|
|
Nm, I got it now. Thank you
|
|
|
|
|
You're welcome. I'm glad you got it sorted.
|
|
|
|
|
Hi, i am new to asp.net. i need to display complete URL of my website in web browser. if user navigate to some other page the url must include address of that page too. plz do help..
|
|
|
|