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)
L前缀使字符串成为wchar_t字符串.您可以使用Windows API函数MultiByteToWideChar
将ANSI字符串转换为wchar_t字符串.
执行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)
归档时间: |
|
查看次数: |
5430 次 |
最近记录: |