0

我正在尝试从 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窗口停止工作程序)

如何将参数传递给函数?

该库的其他功能运行良好。.

我认为这不适用于参数vtPvProp。这些在文档中进行了描述:

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

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

4

0 回答 0