interop

Z

ZhangZQ

I created a ocx that has a method,

[id(5), helpstring("·½·¨Test1")] void Test1(VARIANT* a);

the implementation is
void Cocx030820Ctrl::Test1(VARIANT* a)
{
try
{
//see here
AFX_MANAGE_STATE(AfxGetStaticModuleState());

ST_PRINT* m;
//get data
m=(ST_PRINT*)a;
CString s;
s.Format("%d,%d,%s,%c",m->i,m->l,m->s,m->mSTRU1.c);
MessageBox(s);
}
catch(...)
{
MessageBox("f");
}
}

and the ST_PRINT definition is

#ifndef IOPRINT
#define IOPRINT
typedef struct
{
unsigned char a[11];
unsigned char b[9];
char c;
}STRU1;

typedef struct
{
unsigned char Tran[11];
unsigned char TermId[9];
STRU1 mSTRU1;
char c;
int i;
long l;
double d;
char s[10];
}ST_PRINT;

#endif

My question is how to call the Test1 method in C#
//ST_PRINT
object obj=new object();
how can I set the field value of obj.
axocx0308201.Test1(ref b3);




Thank you very much!
 
M

Mattias Sjögren

the implementation is
void Cocx030820Ctrl::Test1(VARIANT* a)
{
try
{
//see here
AFX_MANAGE_STATE(AfxGetStaticModuleState());

ST_PRINT* m;
//get data
m=(ST_PRINT*)a;

These kinds of hacks might work in C++, but not in C#. Why do you make
the parameter type a VARIANT* when it really isn't?



Mattias
 
Z

ZhangZQ

Dear Mattias,

It is necessary, because that OCX is the third party product, I have to use
it but can not change it, is it possible to do that?

Thank you very much!


ZhangZQ
 
M

Mattias Sjögren

It is necessary, because that OCX is the third party product, I have to use
it but can not change it, is it possible to do that?

Only if you change the managed definition of the method to take an
IntPtr or a ST_PRINT& parameter instead.



Mattias
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top