2017-10-03 18 views
0

ビジュアル基本プロジェクトで、いくつかの列管理されたC++コードを使用するためのC++/CLIラッパーを作成しました。これは私がそれらを構築し、次のエラーがC++/CLIラッパーDLLを使用しているときに関数が見つからない

Error Image

それを来た、Visual Basicプロジェクトでrefrencedとき、すなわち

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

二つの機能があり、この中のコード

#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); 




}; 
} 

です言ったその エラー3 'CheckFreeSpace'はサポートされていないかparameではない戻り値の型を持っていますサポートされていないタイプです。

VB.netはLPCTRSTR型をサポートしていない可能性があると私は理解しましたが、今この問題をどのように解決できますか。

また、別の問題は、C++/CLIがLPCTRSTRをサポートしている場合、VB.netを使用しない理由です。

ありがとうございます。

+1

これはC#のbyte *またはchar *のいずれかのポインタ型です。しかし、vb.netはポインタをサポートしていません。引数の型をString ^に変更し、Marshal :: StringToHGlobalUni()などのポインタに変換します。 –

答えて

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をマーシャリングに関する詳細情報を読むことができます。

+0

Unicodeの 'LPCTSTR' =' const wchar_t * 'です。この問題は、C#が(char * 'パラメータ型を使って)この関数を見ることができるように、マネージコードであるVB.NETには存在せず、ポインタ型をまったくサポートしていないVB.NETにあります。とにかく、あなたは 'System :: String ^'をマネージコードから公開する必要があります。 C++/CLIでP/Invokeの代わりに 'marshal_context'か' PtrToStringChars'を使うと、より簡単で効率的です。 –

+0

あなたは私にいくつかのより多くの情報を与えることができます –

+0

marshal_context –

0

私はこの問題をsystem :: Stringとして関数に取り入れ、問題を解決しました.HansはMicrosoftの例として与えられた標準のMarshall関数を使用してstd :: stringにマーシャリングし、cを呼び出しました。 Str()関数を使用してchar *を取得します。また、問題を解決するために、キャラクタセットをマルチバイトに変更しました。

関連する問題