banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows chuyển đối tượng String thành char* trong VC++ .NET  XML
  [Programming]   chuyển đối tượng String thành char* trong VC++ .NET 01/09/2006 01:04:44 (+0700) | #1 | 19551
[Avatar]
hakuso
HVA Friend

Joined: 04/01/2004 13:28:06
Messages: 287
Location: làng Đo Đo
Offline
[Profile] [PM]
Câu chuyện là thế này smilie)
Tui cần phải dùng một thư viện C++ trong C# và đang đi theo hướng là: tạo 1 dll C++ .NET, trong dll đó sẽ dùng thư viện C++ này và nó đưa ra các method khác cho C# gọi.
Hiện tại thì tui chỉ có thể dùng thư viện C++ đó trong VC .NET thôi, còn để giao tiếp với C# thì gặp rắc rối đầu tiên là kiểu dữ liệu không giống nhau.
Trong thư viện nó dùng char* để đại diện cho chuỗi, còn C# thì dùng String hay char[].
Vấn đề là, trong dll C++ .NET đó, mình đã có đối tượng String rồi (nhận từ C#), vậy làm cách nào để chuyển String thành char* đây ?

Tui không dùng được cú pháp mới (array<>smilie vì để cho C# thấy class C++. Tui phải dùng Common Language Runtime Support, Old Syntax (/clr:oldSyntax)
(click phải vô project C++, chọn properties, "Configuration Properties" > "Common Language Runtime support"smilie

Chờ tin vui lẫn buồn smilie)
Live, fight, work and study
[Up] [Print Copy]
  [Question]   chuyển đối tượng String thành char* trong VC++ .NET 01/09/2006 02:47:58 (+0700) | #2 | 19585
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]
Bác xem ví dụ tôi sử dụng Platform Invoke như sau:
Tôi viết 1 Regular DLL tên là exportdll.dll bằng VC++ có 1 export function như sau:
Code:
void ABC1(char* test)
{
	MessageBox(NULL, test, "testfn", MB_OK);
}

Lưu ý nếu không dùng __declspec(dllexport) cho hàm này thì đặt tên hàm này vào file .def

Sau đó từ project C#, tôi dùng như sau:
Code:
using System.Runtime.InteropServices;

namespace exportdllNET
{
	
	public class MyClass
	{
		[DllImport("exportdll.dll", CharSet=CharSet.Ansi)]
		public static extern void ABC1([MarshalAs(UnmanagedType.LPStr)]
			string test);
	//Khi dùng
         private void Mỳunc()
		{
			String a = "aaabbb";
			ABC1(a);
		}
       }
}
Hibernating
[Up] [Print Copy]
  [Question]   chuyển đối tượng String thành char* trong VC++ .NET 01/09/2006 06:45:34 (+0700) | #3 | 19650
[Avatar]
hakuso
HVA Friend

Joined: 04/01/2004 13:28:06
Messages: 287
Location: làng Đo Đo
Offline
[Profile] [PM]
Z0rr0 hiểu sai ý rùi smilie)
Ý mình là vầy
Dùng VC 6.0 viết 1 thư viện tĩnh, tức là kết quả ra sẽ là file abc.lib
Trong thư viện tĩnh đó sẽ implement 2 method
Code:
int AA() 
{
...
}

char BB()
{

}


Vấn đề là làm sao cho C# dùng được 2 method này ?


Cảm ơn Z0rr0 nhưng mình đã giải quyết được rồi, thực là hỏi chuối quá đi smilie(
Muốn chuyển sang chuỗi byte thì chỉ việc đọc từng index trong String rồi đưa vào chuỗi byte là xong, huhu
Live, fight, work and study
[Up] [Print Copy]
  [Question]   chuyển đối tượng String thành char* trong VC++ .NET 01/09/2006 07:17:09 (+0700) | #4 | 19655
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]

hakuso wrote:
Z0rr0 hiểu sai ý rùi smilie)
Ý mình là vầy
Dùng VC 6.0 viết 1 thư viện tĩnh, tức là kết quả ra sẽ là file abc.lib
Trong thư viện tĩnh đó sẽ implement 2 method
Code:
int AA() 
{
...
}

char BB()
{

}


Vấn đề là làm sao cho C# dùng được 2 method này ?


Cảm ơn Z0rr0 nhưng mình đã giải quyết được rồi, thực là hỏi chuối quá đi smilie(
Muốn chuyển sang chuỗi byte thì chỉ việc đọc từng index trong String rồi đưa vào chuỗi byte là xong, huhu 


Vậy mà bác nói dll, rồi từ String thành char* ... tùm lum làm tui loạn smilie)
Hibernating
[Up] [Print Copy]
  [Question]   chuyển đối tượng String thành char* trong VC++ .NET 01/09/2006 07:50:29 (+0700) | #5 | 19670
[Avatar]
secmask
Elite Member

[Minus]    0    [Plus]
Joined: 29/10/2004 13:52:24
Messages: 553
Location: graveyard
Offline
[Profile] [PM] [WWW]
hổng hiểu bác muốn gì nữa. smilie
[Up] [Print Copy]
  [Question]   chuyển đối tượng String thành char* trong VC++ .NET 01/09/2006 09:55:45 (+0700) | #6 | 19698
TQN
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 22:28:01
Messages: 888
Location: Biết làm chi ?
Offline
[Profile] [PM] [WWW] [Yahoo!]
Ừ, lung tung luôn, sao giờ lại lòi ra cái .lib. File .lib thì làm sao mà dùng cho C# được, hay quá vậy, hay tui hỗng biết.
[Up] [Print Copy]
  [Question]   chuyển đối tượng String thành char* trong VC++ .NET 02/09/2006 06:42:08 (+0700) | #7 | 20028
[Avatar]
hakuso
HVA Friend

Joined: 04/01/2004 13:28:06
Messages: 287
Location: làng Đo Đo
Offline
[Profile] [PM]

ThangCuEm wrote:
Ừ, lung tung luôn, sao giờ lại lòi ra cái .lib. File .lib thì làm sao mà dùng cho C# được, hay quá vậy, hay tui hỗng biết. 


Tất nhiên là không dùng được, nhưng mình đi vòng thì sẽ được (mặc dù không dễ dàng). Đó là đi theo cách tui nói: tạo 1 dll C++ .NET và trong đó mình sẽ dùng thư viện lib này. Khi C# add reference dll vào. Nó chỉ thấy các method mình viết và chỉ việc gọi, và bên trong method đó mình sẽ dùng thư viện lib.
Đúng ra tui nói không rõ ràng trong bài đầu. Xin rút kinh nghiệm smilie)
Live, fight, work and study
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|