|
分類:[ASP.NET (C#)]
こんにちは。
ASP.Net(C#)から自作ActiveX DLLへ文字列の受け渡しを行おう
としていますが、「Marshal.AllocHGlobal」で取得したIntPtrの値が
正しく渡せない状態にあります。64bit環境です。
下記はソースを抜粋したものですが、ASP.Netで表示しているアドレス値
とActiveX側でファイルに出力しているアドレス値が一致しません。
ASP.Netで「Marshal.AllocHGlobal」ではなく、Bitmapから取得した
Graphics.GetHdc()で取得したIntPtrの場合はアドレス値が一致します。
なぜGraphics.GetHdc()で確認したかというと、ActiveXの別メソッドで
Graphics.GetHdc()のIntPtrを引数にしていますが、そちらは問題なく
動作していたためです。
下記ソースで問題あるようでしたらご指摘をお願いします。
また、注意点などありましたらお願いします。
-----------------------------------------------------------------------------------------
(ActiveX DLL)VC++側
BEGIN_DISPATCH_MAP(CTest, CCmdTarget)
DISP_FUNCTION_ID(CTest, "GetTest", dispidGetTest, GetTest, VT_I4, VTS_VARIANT)
END_DISPATCH_MAP()
LONG CTest::GetTest(VARIANT data)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
debug((ULONGLONG)data.pvarVal);
return 0;
}
void CTest::debug(ULONGLONG v)
{
FILE *f;
char msg[256];
sprintf(msg, "%lld\n", v);
f = fopen("C:\\temp\\debug.txt", "a");
fprintf(f, msg);
fclose(f);
}
-----------------------------------------------------------------------------------------
(ASP.Net C#)呼び出し側
[ComImport, Guid("xxxx")]
public class Test
{
}
[Guid("xxxx"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITest
{
Int32 GetTest(
[In, Out, MarshalAs(UnmanagedType.SysInt)] IntPtr data);
}
protected void Page_Load(object sender, EventArgs e)
{
ITest test = (ITest)new Test();
IntPtr hData = Marshal.AllocHGlobal(500);
try
{
div_test.InnerHtml = ((UInt64)hData.ToInt64()).ToString();
test.GetTest(hData);
}
finally
{
Marshal.FreeHGlobal(hData);
}
}
|