台灣最大程式設計社群網站
線上人數
1452
 
會員總數:246690
討論主題:190103
歡迎您免費加入會員
討論區列表 >> C# >> 兩個程式間互傳資料 64位元電腦問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
兩個程式間互傳資料 64位元電腦問題
價值 : 200 QP  點閱數:984 回應數:2
樓主

Asthma
門外漢
0 1
20 0
發送站內信



我在兩個程式間做資料的傳送由 A -> B
OS: WIN7 64-bit
編輯器為 visual studio 2010
我先用x86編譯是成功的, 可以順利執行,
可是當用x64編譯A,B兩個程式後
卻沒有反應了, B就完全沒收到任務Message, 想請問一下以下的程式在x64是否有問題

傳送者A 程式如下 //----------------------------------

private void SendMessageLogB(string strMessage)
{

strMessage = strMessage.Trim();
if (strMessage.Length % 8 == 0)
{
strMessage = strMessage + " ";
}
IntPtr nPrt = ImportFromDLL.FindWindow(null, "LogB");//找TestB的IntPtr 用來代表指標或控制代碼
IntPtr nPrtSend = ImportFromDLL.FindWindow(null, "FS Screw Inspector V1.0");
if (nPrt != IntPtr.Zero)
{
try
{
ImportFromDLL.COPYDATASTRUCT copydata = new ImportFromDLL.COPYDATASTRUCT();
copydata.cbData = Encoding.Default.GetBytes(strMessage).Length;
copydata.lpData = strMessage;

IntPtr tPtr = Marshal.StringToBSTR(strMessage);
ImportFromDLL.SendMessage(nPrt, ImportFromDLL.WM_COPYDATA, nPrtSend, ref copydata);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
public class ImportFromDLL
{
public const int WM_COPYDATA = 0x004A;

//启用非托管代碼
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public int dwData; //not used
public int cbData; //長度
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}

[DllImport("User32.dll")]
public static extern int SendMessage(
IntPtr hWnd,    // handle to destination window
int Msg,    // message
IntPtr wParam,  // first message parameter
ref COPYDATASTRUCT pcd // second message parameter
);

[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("Kernel32.dll", EntryPoint = "GetConsoleWindow")]
public static extern IntPtr GetConsoleWindow();

}


接收者B 程式如下 //----------------------------------


protected override void WndProc(ref Message m)
{
ImportFromDLL.COPYDATASTRUCT copydata = new ImportFromDLL.COPYDATASTRUCT();
if (m.Msg == ImportFromDLL.WM_COPYDATA)
{
string strCmdLine = string.Empty;

copydata = (ImportFromDLL.COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(ImportFromDLL.COPYDATASTRUCT));
if (copydata.cbData > 0)
{
txtRecvMessage.Text=copydata.lpData.ToString(); // 顯示用
}

}
base.WndProc(ref m);

}



public class ImportFromDLL
{
public const UInt32 WM_COPYDATA = 0x004A;

//启用非托管代碼
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public UInt32 dwData; //not used
public UInt32 cbData; //長度
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}

[DllImport("User32.dll")]
public static extern IntPtr SendMessage(
IntPtr hWnd,    // handle to destination window
UInt32 Msg,    // message
IntPtr wParam,  // first message parameter
ref COPYDATASTRUCT pcd // second message parameter
);

[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("Kernel32.dll", EntryPoint = "GetConsoleWindow")]
public static extern IntPtr GetConsoleWindow();

}

搜尋相關Tags的文章: [ SendMessage ] , [ 64位元 ] , [ 傳送 ] , [ x86 ] , [ x64 ] ,
本篇文章發表於2017-07-18 08:52
1樓
回應

小魚
檢舉此回應
那些什麼32.dll的看起來像是寫給32位元的,
這個你要去找一下資料看看。
本篇文章回覆於2017-07-18 12:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

春天
檢舉此回應
你為什麼不編譯成Any Cpu試試,還有win32API在64bitOS也是可以使用的
本篇文章回覆於2017-07-19 10:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.