我正在编写一个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项目中进行修复时,出现以下错误
它说 错误3' CheckFreeSpace'具有不受支持的返回类型或不受支持的参数类型。
据我所知,也许VB.net不支持LPCTRSTR类型,但现在我该如何解决这个问题。
另一个问题是如果C ++ / CLI支持 LPCTRSTR 那么为什么不用VB.net。
提前谢谢。
答案 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 *。我还将我的字符集更改为多字节以解决问题。