如何修复C ++的C#包装器?

时间:2017-02-16 14:53:14

标签: c# c++ c visual-c++ wincc

我正在尝试从dll调用函数。 C ++中函数的描述:

BOOL WINAPI PDLCSGetPropertyEx(LPCTSTR lpszProjectName, LPCTSTR lpszPictureName, LPCTSTR lpszObjectName, LPCTSTR lpszPropName, VARTYPE vt, LPVOID pvProp, DWORD dwFlags, LPVOID pData, PCMN_ERROR pError);

在C#中我写道:

[DllImport("pdlcsapi.dll", EntryPoint = "PDLCSGetPropertyEx", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Winapi)]
    public static extern bool PDLCSGetPropertyEx(
        [In] String lpszProjectName,
        [In] String lpszPictureName,
        [In] String lpszObjectName,
        [In] String lpszPropName,
        VarEnum vt,
         IntPtr pvProp,
        [In] UInt32 dwFlags,
        [In] IntPtr pData,
        [In,Out] [MarshalAs(UnmanagedType.LPStruct)] CMN_ERROR_MANCLASS pError
        );

和应用程序中的调用:

WinCCODK_PDLCS.CMN_ERROR_MANCLASS errPdl;
        errPdl = new WinCCODK_PDLCS.CMN_ERROR_MANCLASS();
        IntPtr p = new IntPtr();
        String propName = listBox2.SelectedItem.ToString();
        String objName = listBox1.SelectedItem.ToString();
        bool ret = WinCCODK_PDLCS.CPDLCSWrapper.PDLCSGetPropertyEx(
            "C:\\DemoProjectV72_Light\\DemoProjectV72_Light.mcp"
            , "io.pdl"
            , objName
            , propName
            , VarEnum.VT_I4
            , p
            , 0
            , IntPtr.Zero
            , errPdl ); 
        if (ret){
            listBox2.Items[listBox2.SelectedIndex] = listBox2.Items[listBox2.SelectedIndex] + val.ToString();
        }else{
            MessageBox.Show(errPdl.szErrorText);
        }

调用此函数后,应用程序崩溃(有一个标准的Windows窗口停止工作程序)

如何将参数传递给函数?

这个库的其他功能正常。

我认为这对参数 vt PvProp 无效。这些在文档中描述:

  

vt
  使用pvProp传递的值的数据类型。定义了有效类型   在“wtypes.h”包含文件中的“VARENUM”枚举中   属于编译器。没有VT_VARIANT,VT_DISPATCH或其他   应该使用引用。

     

PvProp
  指向保存属性值的标记的指针。数据   值的类型由vt确定。对于pvProp,您可以指定任何   为Variant数据类型定义的值;请参阅包含的值   在“wtypes.h”中包含属于您的编译器的文件。对于类型   具有缓冲区(例如BSTR)的缓冲区由缓冲区分配   函数,然后必须由调用应用程序清除。

0 个答案:

没有答案
相关问题