使用C ++ / CLI包装器dll

时间:2017-10-03 23:33:39

标签: c++ c++-cli wrapper

我正在编写一个C ++ / CLI包装器,用于在visual basic项目中使用一些umnmanaged C ++代码。这是代码

    #pragma once
    #include "E:\ARDUINO DLL\UnManagedSystemProfile\UnManagedSystemProfile\SystemProfile.h"
    #include "E:\ARDUINO DLL\UnManagedSystemProfile\UnManagedSystemProfile\SystemProfile.cpp"

using namespace System;

namespace MSystemProfile {

public ref class SystemProfile

{
            SysProfileInterface * System;

public:
    SystemProfile();
 enum class  ConversionDirection:int
    {
        FORWARD,
        REVERSE
    };
    enum class MemoryUnits:int
    {
        BYTE,KB,MB,GB
    };

    double getVolume();
    void   setVolume(float volume);
    void   setScreenBrightness(int brightnessvalue);
    int    getCurrentBatteryLife();
    bool   isLowOnPower();
    bool   isCharged();
    bool   isCharging();
    bool CheckFreeSpace(LPCTSTR lpDirectoryName);
    DWORD64 getFreeSpaceAvailable(LPCTSTR lpDirectoryname);
    DWORDLONG totalVirtualMemory();
    DWORDLONG usedVirtualMemory();
    SIZE_T myVirtualMemoryUse();
    DWORDLONG totalRam();
    DWORDLONG usedRam();
    SIZE_T myRamUse();



    float BtoKB(float   data, MemoryUnitConverter::ConversionDirection  direction);
    float BtoMB(float   data, MemoryUnitConverter::ConversionDirection  direction);
    float BtoGB(float  data, MemoryUnitConverter::ConversionDirection   direction);
    float KBtoMB(float data, MemoryUnitConverter::ConversionDirection   direction);
    float KBtoGB(float  data,MemoryUnitConverter::ConversionDirection   direction);
    float MBtoGB(float  data, MemoryUnitConverter::ConversionDirection   direction);

    float convertTo(MemoryUnitConverter::MemoryUnits sourceunit,MemoryUnitConverter::MemoryUnits destinationunit, float data);




};
}

这里有两个功能,即

bool CheckFreeSpace(LPCTSTR lpDirectoryName);
    DWORD64 getFreeSpaceAvailable(LPCTSTR lpDirectoryname);

当我构建它们并在Visual Basic项目中进行修复时,出现以下错误

Error Image

它说 错误3' CheckFreeSpace'具有不受支持的返回类型或不受支持的参数类型。

据我所知,也许VB.net不支持LPCTRSTR类型,但现在我该如何解决这个问题。

另一个问题是如果C ++ / CLI支持 LPCTRSTR 那么为什么不用VB.net。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

LPCTSTR类型是Microsoft创建的用于Windows API的C / C ++类型。由于C ++ / CLI是带有托管扩展的C ++代码,因此可以无错误地解析LPCTSTR类型。但是,VB.Net是一个托管代码,只能“查看”托管类型,不包括LPCTSTR。

要从/向非托管代码传递参数,您可以使用 MarshalAs 属性。在VB.Net中,函数声明将是:

<DllImport("<your's dll>", CharSet := CharSet.Unicode, SetLastError := true)>
 Friend Shared Function CheckFreeSpace(<MarshalAs(UnmanagedType.LPCStr)> lpDirectoryName as string) As <MarshalAs(UnmanagedType.U1)> Boolean;

您可以阅读有关编组here的更多信息。

答案 1 :(得分:0)

我通过将函数的参数作为system :: String来解决问题,并且正如汉斯所说,使用作为Microsoft示例给出的标准Marshall函数将其编组为std :: string并调用c。 Str()函数在其中获取char *。我还将我的字符集更改为多字节以解决问题。