2010-11-03 22 views
7

Statik bir kütüphanem var. Bu kütüphane, aşağıdaki fonksiyon işlevini çağırmak üzereC++ dizelerinde L öneki L

int WriteData(LPTSTR s) 

örnek tanımlanmış

LPTSTR s = (LPTSTR) L"Test Data"; 
int n = WriteData(s); 

Başarı durumunda 0 ve -1 geri WriteData olup.

Bu işlevi vermek için dinamik bir DLL yazıyorum.

int TestFun(LPTSTR lpData) 
{ 
    return WriteData(lpData); 
} 

A C++ test uygulaması sonucu

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

LPTSTR s = (LPTSTR) "Test Data";  
TestFun(s); //Fail return -1 

Bir C# uygulamasından onu aramak zorunda. Benim DLL İthalat imzası olacağını varsayalım:

 [DllImport("Test.dll")] 
     private static extern int TestFun(String s); 

sorum i .NET onu aramak nasıl çok basit? Gördüğünüz gibi i

TestFun(LPTSTR lpData) 

üzerindeki kontrolünü ama onların girişi için hiçbir kontrole


WriteData(LPTSTR s) 

üzerinde Herkese teşekkürler var. Şimdiye kadar döküm için sıkışıp kaldım. Kullanıcıdan girdi alabildiğimde ve aşağıdaki satırın yerine döküm için 2 satır yazdığımda sorunum çözülecek.

LPTSTR s = (LPTSTR) L"Test Data"); //<= How can ii take input from user and 
    TestFun(s); //OK return 0 
+5

TCHAR'ın kullanımı 10 yıl önce anlamlıdır. Artık desteklemeniz gereken bir Unicode işletim sistemi yok. Her şeyi wchar_t yapın ve devam edin. –

+0

Bunu nasıl yapabilirim? – Manjoor

+0

lpData'yı WriteData işlevine geçirdiğinizde ne işe yaramaz? – harper

cevap

7

L öneki, dizeyi bir wchar_t dizesi haline getirir. Bir ANSI dizesini bir wchar_t dizesine dönüştürmek için Windows API işlevini MultiByteToWideChar kullanabilirsiniz.

+0

Benim durumumda çalışmıyor – Manjoor

+1

Nasıl çalışmıyor? –

+6

@Manjoor: Gerçekten NEDEN çalışmıyorsa açıklamalısınız. Bu adamlar size hiçbir ücret ödemeksizin yardım etmeye çalışıyorlar ve onlara yardım etmiyorsunuz ve çabalarını reddediyorsunuz ve zamanlarını boşa harcıyorlarmış gibi hissettiriyorsunuz çünkü siz onların çözümlerinin neden tam olarak olduğunu söyleyemeyecek kadar tembelsiniz. Senin için çalışıyorum. –

0

Dizelerinizi _T(...) makrosuna koyardım. Bu şekilde ANSI ve UNICODE arasında taşınabilir.

Taşınabilir dize türünü kullandığınızı unutmayın - LPTSTR - T not edin. Yapı ayarlarına bağlı olarak ANSI ve UNICODE arasında değişecektir.

+0

Not: '_T' makrosu Microsoft'a özgüdür, LPTSTR gibi genel C++ değildir. Yeniden ya da çok zor değil. –

6

L önekini gerçekleştirmek için belirli "işlev", bir makro TEXT() veya _T()'dur. (TEXT, Windows SDK tarafından tanımlanmıştır, _T, Microsoft C Çalışma Zamanı'nın bir uzantısıdır).

Bu işlev, projeniz unicode desteği ile oluşturulduğunda (şimdi MS Dev ortamlarında artık yeni projeler için varsayılan) L ön ekini otomatik olarak ekler veya unicode (veya ansi) yapılandırılmamış projeler için onu bırakır. Proje şimdiye hala geniş bir karakter dizisi olacağını olmayan Unicode, ardından L' "ABC" için yapılandırılmış ise

LPTSTR s = (LPTSTR) L"ABC"; // Working fine 
    WriteData(s); 

ama LPTSTR bir işaretçi haline gelmeli

bu döküm yapmayın 8bit karakterden oluşan bir dizi.

Ansi, Unicode veya "Text" dizesine doğru bir dize nasıl atamaktır.(Metin, proje ayarlarına bağlı olarak Ansi veya Unicode olabilir) (L'yi gereksiz olduğu için bıraktım ve bir C ekledim, çünkü dize değişmezleri sabit olmalıdır).

int TestFun(LPTSTR lpData) 
{ 
    return WriteData(lpData); // Should be happy 
} 

Ama çağrı senin fonksiyonu, dikkatli olmak gerekir zaman:

TestFun((LPTSTR) L"ABC"); // Will work fine 
TestFun((LPTSTR) "ABC"); // Will not work 

PCSTR p1 = "ABC"; 
PCWSTR p2 = L"ABC"; 
PCTSTR p3 = TEXT("ABC"); 
+0

Cevabınız için teşekkürler, ancak sorunumu çözmüyor. – Manjoor

+5

Ona neyin işe yaramadığını söylemek yerine ona yükünü koymak yerine ne dediğini söyleyeyim? Senin için hiçbir ücret ödemeden soruna cevap vermek için zamanından zaman ayırıyor. En azından ona _some_ bilgilerini verebilirsin. –

1

Ben senin işlevi sadece sorunsuz çalışır gibi, kafanın karışık olduğunu düşünüyorum Bunun nedeni, "ABC" ve L "ABC" nin iki farklı şey olmasıdır. Eğer hafızada onlara bakacak olursak:

"ABC" | 65 66 67 00 
L"ABC" | 65 00 66 00 67 00 00 00 

Düzenlendi

eklemek için:

Net
L önek gibi bir şey

Bu sadece yanlış yoktur.

Console::WriteLine(L"Hello World"); 
+0

Sorumu belirttiğim gibi, bu dinamik dll olacak. Bu dll bir .NET uygulaması çağrılabilir. L öneki gibi bir şey yoktur. Net – Manjoor

+0

dll dışa aktarma işlevi 'TestFun'. Bana bir C# uygulamasından nasıl diyebilirim? Bu dll-import [DllImport ("Test).dll ")] özel statik extern int TestFun (Dize s); – Manjoor

+0

Çabanız için teşekkürler, ancak test için C# 'dan arıyorum ve easylanguage denilmesi gerekiyor, bu yüzden L. kullanamıyorum – Manjoor

1

Dene: MSDN üzerine MarshalAsAttribute ile dizme üzerine

[DllImport("Test.dll")] 
private static extern int TestFun([MarshalAs(UnmanagedType.LPTStr)] string s); 

fazla bilgi VisualStudio - "> CLR Konsolu Yeni Projesi> C++" ve ilk satırı Sadece açıldı.

İlgili konular