- PR -

C++からC#への移植

1
投稿者投稿内容
ももだい
会議室デビュー日: 2003/10/27
投稿数: 10
投稿日時: 2003-10-27 13:21
初めまして、百瀬と申します。

VC6.0で作成されていたプログラムをC#に置き換える作業を行っています。
まず問題のソースの一部です。


ファイル<test.h>

typedef struct test_str {
LPTSTR TestData;
} test_str, *ltest_str;


ファイル<test.c>

LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
ltest_str test_str = NULL;

test_str = (ltest_str)lparam;

MessageBox(test_str->TestData);
}


このC++で作成したプログラムをC#で書き直しているのですが

test_str = (ltest_str)lparam;

この部分がどうやって書き換えたらよいかわからず詰まっております。

test.hでtest_strという構造体を宣言しています。
このプログラムはある外部DLLを使用し、イベントが起きるとWindowに
メッセージを送ってきます。メッセージを受け取るとコールバック関数WindowProcが実行されます。
その時lparamにはDLL側の構造体のアドレス?が入っています。
MessageBoxでtest_str->TestDataで構造体のメンバを参照するとDLLからの文字列が入っています。

DLLはC++で作成されています。

まだC#を始めたばかりで下手な説明で申し訳ありません。
よろしくお願い致します。

開発環境
・WindowsXP Professional(SP1)
・VisualStudio.NET 2002 Professional Edition
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-10-27 20:05
引用:

test_str = (ltest_str)lparam;

この部分がどうやって書き換えたらよいかわからず詰まっております。


こんなカンジになるのかなぁ??
#ちょっとやったことないのでこれでいいのか分かりませんが・・・^^;
#間違ってたらゴメンナサイ・・・。

using System.Runtime.InteropServices;

public struct test_str {
[MarshalAs(UnmanagedType.LPTStr)] public string TestData;
}


public static uint WindowProc(uint message, uint wParam, uint lParam)
{

test_str testStr = (test_str)Marshal.PtrToStructure(new IntPtr(lParam), typeof(test_str));

}
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-10-28 10:25
すみません。どうやらこうみたいですね。。。
#ちゃんと調べないといけないですね。

コード:
protected override void WndProc(ref Message m) {

    test_str testStr = (test_str)m.GetLParam(typeof(test_str));

    base.WndProc(ref m);
}


ももだい
会議室デビュー日: 2003/10/27
投稿数: 10
投稿日時: 2003-10-28 10:26
架空兎さん

お返事ありがとうございます。

> test_str testStr = (test_str)Marshal.PtrToStructure(new IntPtr(lParam), typeof(test_str));

最初は動作しているように見えたのですが、おかしな文字列が帰ってきてしまいます・・・
すみません。よろしくお願いします。



[ メッセージ編集済み 編集者: ももだい 編集日時 2003-10-28 10:30 ]
ももだい
会議室デビュー日: 2003/10/27
投稿数: 10
投稿日時: 2003-10-28 10:37
架空兎さん

書き込みありがとうございました。

> test_str testStr = (test_str)m.GetLParam(typeof(test_str));

このコードでばっちり動作するようになりました!!私もGetLParamが怪しいような気はしていたのですが、いまいち書き方がわからず頓挫しておりました。
誠にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)