C++中字符串的L前缀

Man*_*oor 7 .net c# c++ interop marshalling

我有一个静态库.该库定义了以下功能

int WriteData(LPTSTR s)
Run Code Online (Sandbox Code Playgroud)

调用该函数的示例是

LPTSTR s = (LPTSTR) L"Test Data";   
int n = WriteData(s);
Run Code Online (Sandbox Code Playgroud)

WriteData成功返回0,失败时返回-1.

我正在编写动态DLL来导出此函数.

int TestFun(LPTSTR lpData)
{
   return  WriteData(lpData);
}
Run Code Online (Sandbox Code Playgroud)

C++测试应用程序结果

LPTSTR s = (LPTSTR) L"Test Data";   
TestFun(s);  //OK  return 0

LPTSTR s = (LPTSTR) "Test Data";    
TestFun(s);  //Fail  return -1
Run Code Online (Sandbox Code Playgroud)

我必须从ac#应用程序调用它.我假设我的DLL-Import签名是:

        [DllImport("Test.dll")]
        private static extern int TestFun(String s);
Run Code Online (Sandbox Code Playgroud)

我的问题非常简单如何从.Net调用它?如你所见,我可以控制

TestFun(LPTSTR lpData)
Run Code Online (Sandbox Code Playgroud)

但无法控制

WriteData(LPTSTR s)
Run Code Online (Sandbox Code Playgroud)

感谢大家的投入.到目前为止,我仍然坚持施法.我认为当我能够从用户那里获取输入并写下2行代替以下行时,我的问题将得到解决.

   LPTSTR s = (LPTSTR) L"Test Data"); //<= How can ii take input from user and 
    TestFun(s);  //OK  return 0
Run Code Online (Sandbox Code Playgroud)

har*_*per 7

L前缀使字符串成为wchar_t字符串.您可以使用Windows API函数MultiByteToWideChar将ANSI字符串转换为wchar_t字符串.

  • @Manjoor:不,这里不够好.如果你希望人们花时间在你的工作上而不付钱,你应该向他们描述究竟出了什么问题,你的预期产出是什么,你的实际产出是什么,特别是当你回答答案的时候. (12认同)
  • @Manjoor:你应该解释为什么它不起作用.这些家伙正试图免费帮助你并且对他们没有任何好处,你正在摒弃他们的努力并让他们觉得他们在浪费时间,因为你太懒得告诉他们为什么他们的解决方案没有不适合你. (6认同)

Chr*_*cke 6

执行L前缀的特定"功能"是宏TEXT()_T().(TEXT由Windows SDK定义,_T是Microsoft C Runtime的扩展).

当您的项目构建时使用unicode支持(这是大多数MS Dev环境中现在的新项目的默认设置)时,这些函数会自动添加L前缀 - 或者为非unicode(或ansi)配置的项目保留它.

不要做这个演员:

LPTSTR s = (LPTSTR) L"ABC";   // Working fine
     WriteData(s);
Run Code Online (Sandbox Code Playgroud)

如果项目曾经配置为非Unicode,那么L"ABC"仍然是一个宽字符数组,但LPTSTR将成为指向8位字符数组的指针.

这是如何正确地将字符串分配给Ansi,Unicode或"Text"字符串.(文本可以是Ansi或Unicode,具体取决于项目设置)(我因为冗余而离开了L,并添加了一个C,因为字符串文字应该是常量).

PCSTR p1 = "ABC";
PCWSTR p2 = L"ABC";
PCTSTR p3 = TEXT("ABC");
Run Code Online (Sandbox Code Playgroud)

  • 你怎么告诉他什么不起作用而不是把负担放在他身上?他正在抽出时间来回答您的问题而不花任何费用.你至少可以给他_some_信息. (5认同)