使用大漠DLL插件中的screentoclient()函数,使用Tlbimp转换,版本为3.5
转换后的原型为screentoclient(int hwnd,ref object x,ref object y)作用是将屏幕x,y的坐标值改变为某窗口客户区的坐标值
查询得知,该插件好像是c++开发的控件,这两个值使用的是变体变量,于是使用object进行封箱。
string x=null,y=null;
object x1=x;
object y1=y;
调用screentoclient报错说插件仅能识别VT_I2和VT_I4,网上查意思是VC++整型变体变量和长整型变体变量
于是改用
Int16 x=0,y=0;
object x1=x;
object y1=y;

Int64 x=0,y=0;
object x1=x;
object y1=y;
包括Int32也试了,全都是报错为数据类型不兼容,请问这里应该怎么进行封箱才能正确取得x,y坐标的值
我用的VS2008的C#。

解决方案 »

  1.   

    int x = 0, y = 0;
    object v1 = new VariantWrapper(x);
    object v2 = new VariantWrapper(y);
    dm.ScreenToClient((int)this.Handle, ref v1, ref v2);
    x = (int)v1;
    y = (int)v2;
      

  2.   

    楼主,你先把这个函数screentoclient,的C++的定义贴出看看
      

  3.   

    设置一下VT的类型  
    C++的长这样
    你看看怎么弄成C#的。。估计差不多
    myx1 = (VARIANT*)CoTaskMemAlloc(sizeof(VARIANT));
    myy1 = (VARIANT*)CoTaskMemAlloc(sizeof(VARIANT));
    myx1->vt = VT_I2;
    myy1->vt = VT_I2;
    myx1->iVal = 510;
    myy1->iVal = 338;
    dme->ClientToScreen(myhwnd,myx1,myy1);
    long x = myx1->iVal;