- - PR -
J#の作りとVC++からの呼び出し
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-01-06 22:16
J#で以下のようなコードを書き、C++からGetProcAddressで関数ポインタを取得しようとしますが、LoadModuleは成功しますが、関数のポインタは取得できません、ご教授ください。
抜粋 [VJ#側 temp.dllとしてbuild] packag foo.network; public class Session implements Status public synchronized void login(String u,String p) { loginID=u; primaryID=null; password=p; sessionId=0; imvironment="0"; try { network.open(); loginOver=false; startThreads(); transmitAuth(); long timeout = System.currentTimeMillis()+Util.loginTimeout(LOGIN_TIMEOUT); while(!loginOver && !past(timeout)) { if(past(timeout)) { sessionStatus=FAILED; closeNetwork(); throw new InterruptedIOException("Login timed out"); } else if(sessionStatus==FAILED && loginException!=null) else if(loginException instanceof LoginRefusedException) } } finally { members reset. } } [VC++側] int main(void) { hDllModule= LoadLibrary(_T("temp.dll")); if(hDllModule == NULL) { MessageBox(_T("Error Loading DLL"), _T("Error"), MB_OK); FreeLibrary(hDllModule); exit(-1); } ymsg fnLogIn= NULL; LPCSTR lpStr= "temp::login"; DWORD er= -1; fnLogIn= (tmpFn)GetProcAddress(hDllModule, lpStr); er= GetLastError(); if(fnLogIn == NULL) MessageBox(_T("Function Can't Loadable"), _T("Error"), MB_OK); else MessageBox(_T("Function Load OK"), _T("Success"), MB_OK); if(hDllModule != NULL) FreeLibrary(hDllModule); } dllの読み込みは正常(NULL以外が返る)が、GetProcAddressはNULLを、erは関数が見つからない(127)が 返ってきます。 dumpbinで見ると、関数リストにloginというのが現れません、関数リストに出す方法があるのか? または別の方法を試すのか?よろしくお願いします。 [ メッセージ編集済み 編集者: Kansaian 編集日時 2008-01-06 22:17 ] [ メッセージ編集済み 編集者: Kansaian 編集日時 2008-01-06 22:24 ] | ||||
|
投稿日時: 2008-01-06 23:10
VJ# で作成できる DLLって .NET アセンブリじゃないですか? だとしたら、GetProcAddress 関数で呼び出すことはできません。VC++からどうしても VJ# で作成されたコードを呼び出す必要があるのなら、VJ# で作成した .NET アセンブリに COM 相互運用性を持たせれば、VC++ から COM として扱うことはできると思います。
.NET のことはあまり(とくに VJ# なんてさっぱり)知らないので上記は推測で書いています。もしかしたら、私の予想に反して、VJ# で stdcall 呼び出し規約で関数をエクスポートする機能があるのかもしれないし、はたまた、VJ# では .NET アセンブリに COM 相互運用性を持たせることすらできないなんてこともあるかもしれないです。 とりあえず、DLL にもいろいろと種類があるので、どのような手順で DLL を作成したのか書いておいたら? そうしたら、より明確な回答が付くかも。 | ||||
|
投稿日時: 2008-01-06 23:28
J# なら C++/CLI で関数ポインタではなくて Assembly を Load してうんぬん、デリゲートで云々が筋だと思いますけど...
_________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2008-01-07 00:54
J#のDLLは既存のJAVAコードを改変してVS2005VJ#にてライブ来の作成にて作成しCOM相互を持たせたものですが、確かに関数をエクスポートする方法を錯誤していたのですが見つかりませんでした。 | ||||
|
投稿日時: 2008-01-07 00:57
MSDNによると、Assemblyをロードして、Delegeteする例が載っていました。 この方法で試してみようかと思っています。 | ||||
|
投稿日時: 2008-01-07 09:01
どのページがわからないですが、それは C++/CLI の用例ではないでしょうか。 元のソースを拝見しますと C++/CLI ではないですよね。 言語変更可能な案件なのでしょうか? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2008-01-07 10:21
もともとのコードが VJ# ではなく Java だというのなら、VC++ から JNI を利用して Java のコード(クラスファイル)を実行することもできますよ。JNI は Java から C のコードを呼ぶだけでなく、C から JVM の起動や Java のコード呼び出しもできるのです。
また、Java のコードを Beans としてラップすれば、 Java Beans を COM として公開することもできます。 | ||||
|
投稿日時: 2008-01-08 10:42
皆様ご助言ありがとうございます。ソースはもともとSUNのJAVA-VM用でした。
結局時間がなかったので、ひとつDllを読み込むよう様なクラスを作り、そこに流し込みました。 [抜粋] ヘッダ #using "temp.dll" class CDllPool { public: int fnDllLogin(char *strUname, char *strPasswd); int fnDllLogoff(); ・ ・ ・ private: gcroot<temp::network::Session^>m_entPoint; } ソース #include "DllPool.h" int CDllPool::fnDllLogin(char *strUname, char *strPasswd) { DWORD err= -1; try { m_entPoint->login(System::String::String(strUname).ToString(), System::String::String(strPasswd).ToString()); err= GetLastError(); } catch(...) { } } int CDllPool::fnDllLogout(void) { DWORD err= -1; try { m_entPoint->logout(); err= GetLastError(); } catch(...) { } } メインクラス CDllPool m_clsDll; char *pszUname= "foo"; char *pszPasswd= "baz"; m_clsDll->fnDllLogin(pszUname, pszPasswd); としてみました。 JNIは大変興味深いので調べてみたいと思います。 |
1