ページ 11

VCでのdllからのライブラリファイル作成について

Posted: 2011年3月29日(火) 23:26
by Ciel
お世話になります。

VC2008を使ってますが、dllからのライブラリファイル作成について、質問があります。
今、euc-jp→SHIFT-JISへの文字コードの変換を行うために、
WINAPIのConvertINetMultiByteToUnicodeっていう関数を使おうとしています。

これのヘッダファイルはmlang.hなんですが、ライブラリファイル(.lib)がありません。

なので↓のリンク先を参考にライブラリファイルを手動で作ったのですが、
リンクエラーがまだ発生してしまいます。
http://ameblo.jp/nana-2007-july/entry-10101317623.html

defファイルの中身は↓です。
これを使って、上記リンクの通りコマンドプロンプトから実行して、
libファイルは作成できたのですが、リンクエラーが出るのです。

コード:

EXPORTS
	ConvertINetReset
	ConvertINetString
	ConvertINetUnicodeToMultiByte
	ConvertINetMultiByteToUnicode
	DllCanUnloadNow
	DllGetClassObject
	GetGlobalFontLinkObject
	IsConvertINetStringAvailable
	LcidToRfc1766A
	LcidToRfc1766W
	Rfc1766ToLcidA
	Rfc1766ToLcidW
エラーメッセージは、
【error LNK2019: 未解決の外部シンボル _ConvertINetMultiByteToUnicode@24】

こんな感じです。
この関数以外は使ってません。

何が原因が分かる方いらっしゃれば、アドバイスいただければと思います。

よろしくお願い致します。

Re: VCでのdllからのライブラリファイル作成について

Posted: 2011年3月30日(水) 10:35
by toyo
libファイルはプロジェクトの設定や#pragma等でリンクしましたか
DLL呼び出しならLoadLibrary()とGetProcAddress ()を使う方法もあります

それとEUC-JPからSJISへの変換ならUNICODEを使う必要は無いですよ

Re: VCでのdllからのライブラリファイル作成について

Posted: 2011年3月30日(水) 21:23
by Ciel
toyo さんが書きました:libファイルはプロジェクトの設定や#pragma等でリンクしましたか
DLL呼び出しならLoadLibrary()とGetProcAddress ()を使う方法もあります

それとEUC-JPからSJISへの変換ならUNICODEを使う必要は無いですよ
toyoさん、ありがとうございます
リンクの設定は間違いなくしましたが、ダメでした。

LoadLibraryとかは使ったことないので、また調べてやってみます。

>>それとEUC-JPからSJISへの変換ならUNICODEを使う必要は無いですよ

もしお時間があれば、これについてどういうことか、ちょこっと説明していただけると助かります。

今ちょっと時間ないので返信は大分遅れると思います。

Re: VCでのdllからのライブラリファイル作成について

Posted: 2011年3月31日(木) 10:59
by toyo
LoadLibraryを使ったサンプルです

コード:

#include <stdio.h>
#include <windows.h>
// ConvertINetMultiByteToUnicode の引数戻り値と同じ関数ポインタを定義
typedef HRESULT (__stdcall *func)(LPDWORD, DWORD, LPCSTR, LPINT, LPWSTR, LPINT);
int main(void)
{
    FILE* fp;
    HRESULT ret;
    DWORD mode = 0;
    int length = 255;
    WCHAR string[256] = {0};
    // DLLを読み込み
    HMODULE hDll = LoadLibrary(TEXT("mlang.dll"));
    // DLL関数のポインタを取得
    func ConvertINetMultiByteToUnicode = (func)GetProcAddress(hDll, "ConvertINetMultiByteToUnicode");
    // 関数実行
    ret = ConvertINetMultiByteToUnicode(&mode, 932, "テスト", NULL, string, &length);
    // テキストに出力
    fp = fopen("test.txt", "w");
    fputc(0xFF, fp); // BOM(Byte Order Mark)
    fputc(0xFE, fp); // Little Endian
    fwrite(string, sizeof(WCHAR), length, fp);
    fclose(fp);
    return 0;
}
EUC-JPもシフトJISもJISコードを変換した物なので計算式で相互変換が可能です
EUC-JPをJISに変換しJISからシフトJISに変換すればUNICODEは関係なく変換できます
http://homepage3.nifty.com/aokura/src/euc2ms.html
に変換コードのサンプルがあります(3バイトEUC-JPの文字には対応してないようです)